掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

楼主: jonah_w

[求助] 正则表达式请教

[复制链接]
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-25 21:50:38 | 显示全部楼层
    VimVim 发表于 2018-12-25 17:54! v* e% V9 i9 U- s, o- _" `
    给你两个解决方案,均已测试通过!
    " x& Z/ L( z( S. r1 O
    因为图片和文档里说的要复制的内容好像不一致,两个都试了下:
    " n0 C, l0 w9 r- S+ R; P第一种方案先通过 :let @a = '$2h"tyi"vit:s/\~^Rt/g^M/<d:entry^M':* _1 d; P1 h6 ?3 Z8 x7 K" J
    复制进寄存器a 回车报错:invalid expression '$2h"tyi"vit:s/\~^Rt/g^M/<d:entry^M'2 K: X  k7 a( S6 a) A! Z' i, ~
    换成let @a = '$2h"tyi"vit:s/\~/t/g /<d:entry' 没有报错。然后继续运行4@a,结果报错no range allowed$2h"tyi"vit:s/\~/t/g /<d:entry2 [) `7 s$ g$ G% o; @4 Q, J, S

    ( L! G+ I+ C& c, d5 C! ~: t第二种方案,同样输入:let @b = "vatgJn" 没报错。* m+ R3 e/ J, Y1 g! C+ g" i
    再执行4@b 报错 Not an editor command: vatgJn
    6 k* C2 ?. j' |1 G/ s- Q. |+ o' ]' S: ^5 P; E5 e  s5 N
    不知道是不是我操作的问题。4 F3 V& G: A/ i2 v% Z. `. ^
    对了,我在Mac电脑上操作的。用的MacVim软件
    # K+ d' C. f. r5 I% [& [7 e9 V% I. s+ S$ v8 u
  • TA的每日心情

    2023-7-4 23:24
  • 签到天数: 390 天

    [LV.9]以坛为家II

    发表于 2018-12-25 22:20:28 | 显示全部楼层
    正则应该是可以做的,多用几个子单元应该就可以,从第一行的title关键字后取出单词,在/d之前的字段全部贪婪匹配~,理论上是可以执行下去的
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-25 22:24:57 | 显示全部楼层
    thresh 发表于 2018-12-25 22:209 D9 w7 H8 H+ f. v" L: b
    正则应该是可以做的,多用几个子单元应该就可以,从第一行的title关键字后取出单词,在/d之前的字段全部贪 ...
    ' ~6 i8 J2 V: s" W  a: a/ ?) n& z
    贪婪匹配就全乱了… title跟~对不上了…
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    发表于 2018-12-25 22:56:24 | 显示全部楼层
    本帖最后由 VimVim 于 2018-12-25 23:04 编辑 ; y* Y' n: C: p7 D
    jonah_w 发表于 2018-12-25 21:50
    7 W/ p+ [5 o0 I因为图片和文档里说的要复制的内容好像不一致,两个都试了下:
    4 z; ^7 q+ k1 t: @: T( g. Z; V. x第一种方案先通过 :let @a = '$2h"tyi"vit ...
    7 o; A- I; Y3 U2 c2 A; W, i& G
    之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看到截图中的^R并不是常规的字符,而是在宏命令中的Ctrl+R7 X2 ?: q, n9 F0 L

    7 X+ o1 M% y8 e$ d: h) ?1 B同时看你的截图跟我的截图不同,上述特殊字符在你的截图中看不见,可能是mac或vimrc配置的编码不同造成,你自己用qa录制出符合你系统的特殊字符,然后用"ap粘贴出来这些特殊字符,照我的截图补全即可。) W/ {5 X# M8 p! y3 g# Q" G$ |8 a
    2 n7 |6 T. l2 p% M. }
    你只能通过yank命令来实现准确复制特殊字符,不要用let之类,如下两个步骤可实现复制:$ \% n! O8 S, q
    1、先把光标移到第一个字符
    2 @( e- ^' D/ H/ S  ~1 i  V2、"ay$
    " s/ O! `1 B& q
    8 R* s, d% ^' h& M& V无论如何,这是我觉得众多方法中最简洁的,而且不破坏原词典文件的排版格式。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 00:04:31 | 显示全部楼层
    VimVim 发表于 2018-12-25 22:56
    $ G$ D7 V" Z' V6 J之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看 ...

    ( m5 b2 M' m: h) `, r; Q; Z# E是正则的宏处理吗? 可不可以直接说下正则的思路,然后我试试在其他编辑器写出来,对vim尤其是宏这块完全陌生… 不知从何入手* T2 r) d# q* F5 R6 C/ I
    & y; ]& `# A. {; m1 |: c8 p" E
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 00:18:13 | 显示全部楼层
    VimVim 发表于 2018-12-25 22:56/ J) v0 M' \$ L" a: d; U5 y( V
    之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看 ...

    8 j! t7 o$ R. F6 y& c另外 按999@a 以后进入了visual模式 是不是有问题
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 00:27:32 | 显示全部楼层
    VimVim 发表于 2018-12-25 17:54! t+ L7 d- B3 `6 n6 L! H
    给你两个解决方案,均已测试通过!
    & W& ?! f; k+ D9 a8 s
    是在normal模式下输入 999@a 吗 好像没什么反应
  • TA的每日心情
    开心
    2019-8-21 08:44
  • 签到天数: 163 天

    [LV.7]常住居民III

    发表于 2018-12-26 01:57:54 | 显示全部楼层
    本帖最后由 mikeee 于 2018-12-26 02:20 编辑
    ( z# K7 N9 J( o: \" B4 g
    " K! t$ Y3 f% r
    1. (?<=<d:entry)([\s\S]*?title=")([^"]+)([\w\W]*)(~)([\s\S]*?)(?=</d:entry)
    复制代码
    2 m* S$ o3 S0 k" I
    换成
    1. \1\2\3\2\5
    复制代码
      H' f3 y2 Z3 _4 R2 c0 D/ `
    https://regex101.com/r/iWAJTc/1/
    * u& a, G. g1 T2 N" E( E' H9 \7 F8 V5 {/ x4 I/ X0 I
    我也凑个热闹……貌似可以,不过一次只能换掉一个。多个 ~ 就要点击多次。
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    发表于 2018-12-26 06:37:07 | 显示全部楼层
    本帖最后由 VimVim 于 2018-12-26 11:59 编辑
    4 _9 J$ h8 J3 g5 E; A4 a
    jonah_w 发表于 2018-12-26 00:047 W3 R, S. o% g6 I7 i
    是正则的宏处理吗? 可不可以直接说下正则的思路,然后我试试在其他编辑器写出来,对vim尤其是宏这块完全 ...
    2 J9 H0 R& a1 ~# O( T* j$ k
    1、正则的思路二楼已经说的很清楚了,这里再补充一点详细信息:
    : W- K0 z( W8 F" ~2 q2 J# m0 G8 N8 y* {$ Y) l# C& _

    % K0 s+ o% s. M* i1 K9 q) K我只是照这个思路根据你的词典结构具体实现,并采用vim的替换功能,以及宏命令重复运行该替换操作。* M& b( D. I: h- }+ n  X; F
    8 m" x" s! y; |3 B$ r- R
    2、你只要:help usr_10即可获得关于本解决方案所需要的Vim基础知识
    6 Z0 j) h' l5 a: N8 y2 d' |! T3 M4 ]* r, y# D& a! z$ f# w
    3、补充方案一的具体思路:/ J. F& I# Z# e6 S5 P- V; M) k2 j
    $2h:定位光标到词条定义中
    8 f1 d6 S: a1 ^6 F, Z# t"tyi":将词条复制进寄存器t(寓意title)- I/ J; ~7 h" S( G* \
    vit:选中当前位置所在标签所包围的内容/ f. L/ k' O1 s9 v' s$ X) g3 I
    :s/\~/^Rt/g:在上述选区范围内进行搜索替换,将所有的~替换为寄存器t中的title内容(其中^R是指Ctrl+r,并非简单字符)
    2 m9 z5 T$ {: s- o1 {' J/<d:entry:搜索定位到下一个词条起始位置
    8 }+ T) w! W9 z+ n( b$ B# G* g最后将上述指令放入寄存器中,并用宏命令@重复执行该寄存器的所有指令。
    + {$ h: {; I/ O  w% z1 H( l' l2 G& N2 f  o; u
    7 Q2 t) s, c: w3 _
    - ]3 Z; {8 w0 Y4 R+ j+ Q- K6 f
    ' ?) \$ L2 [4 a. C$ g( ~
    2 l* ~, b9 w( p6 u# x7 _
    # Z- |- X7 N# z

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?免费注册

    x
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    发表于 2018-12-26 08:41:09 | 显示全部楼层
    VimVim 发表于 2018-12-26 06:37& `) k! e: n! s# D1 y
    1、正则的思路二楼已经说的很清楚了。我只是照这个思路根据你的词典结构具体实现,并采用vim的替换功能, ...

    : [1 k" ?% C4 c3 z6 k两个方案的实施视频如附,即使不会用看看也过瘾:' R7 H" \" J9 k% x+ s% e

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?免费注册

    x
  • TA的每日心情
    无聊
    2019-1-1 20:10
  • 签到天数: 31 天

    [LV.5]常住居民I

    发表于 2018-12-26 10:02:26 | 显示全部楼层
    这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml 库。, P. I9 ]. V' l! J& ^& h

    1. # m' t( {+ u3 f; R1 O" R
    2. #!/usr/bin/env python23 m' e- K/ q3 h2 j# n
    3. # -*- coding: utf-8 -*-
      7 e- z: i$ B( i  @8 L
    4. """
      6 U- D  D. R! Z. |7 Z) T  A
    5. File: replace_tilde_with_title.py
      ' M; [! m9 q2 n6 [$ \
    6. Author: zzhirong8 c2 {+ t7 `7 ^0 g% y! k
    7. Email: [email protected]' u! b& B: B3 P# A# C5 y
    8. Description: 替换 span 下的 ~ 为 d:entry 的 d:title 属性: U5 O5 F( K3 @# }
    9. """
      & S6 K+ \5 m3 `, A! F( j0 a/ [( Q( Q

    10. 2 v) G. B" X9 ^4 p
    11. from lxml import etree' k1 t2 b0 n& X/ d2 @

    12. 0 w& V: ~; F4 q; c
    13. s = """<?xml version="1.0" encoding="UTF-8"?>$ i. `5 y8 U0 x/ }0 `, ^' ^
    14. <d:dictionary xmlns="http://www.w3.org/1999/xml" xmlns:d="http://www.apple.com/DTDs/DictionaryService-1.0.rng">
      " `  b7 [  q9 I. S' p  s' `, L
    15. <d:entry id="_38ja" d:title="xxx">4 J% L' \# B& j& H- `
    16. <d:index d:value="steal" d:title="steal"/><span class="hw">steal</span><br/>
      % S( j; _# p' l' E9 P
    17. <span class="ex">~ a visit <span class="tag1">(an interview)</span> </span><span class="ex_c">测试<span class="tag1">(测试)</span></span>
      , M) {% Z1 \/ y0 Q/ f- X
    18. <span class="ex">~ a kiss </span><span class="ex_c">测试</span>3 S. ~0 R+ T% @8 Q4 w3 K
    19. <span class="ex">~ rides on the train </span><span class="ex_c">测试</span>
      6 p; m1 U6 K3 S0 p* v9 z% a+ D
    20. </d:entry>' y# T- R8 {* d0 T/ W; F. P! L" L' C  l  g
    21. </d:dictionary>1 t; I1 `+ w3 ]! Y! Z" H  M
    22. """& t; Z  ]7 s) Y8 e7 O' i1 e! N4 O6 d

    23. 2 _" r; x6 c( V- W& o0 X
    24. xml = etree.XML(s)
      % y! ^8 W( Y7 |; W8 ^
    25. D_NS = xml.nsmap["d"]
      0 L3 Q& c: m$ ?1 D4 M
    26. XML_NS = xml.nsmap[None]
      / t& h# U6 l2 u5 ?& J

    27. 5 z2 H0 V3 k" q# `4 S' Z) Z* ?: `  a
    28. for entry in xml.xpath("//d:entry", namespaces={"d": xml.nsmap["d"]}):8 \% w3 a7 M2 O  r: T
    29.     title = entry.get("{%s}title" % D_NS, "")4 e$ e9 q$ r( r" ^% e9 m
    30.     for span in entry.iterfind("./{%s}span" % XML_NS):
        M# q+ h2 l. y8 b* x
    31.         span.text = span.text.replace("~", title)$ ?9 e+ Z9 B  r, {6 j
    32. print(etree.tostring(xml)): }% ?5 ]1 j7 T0 h1 d5 h% a( o. w
    复制代码

      ~! A1 |  D- M7 S

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?免费注册

    x
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:25:34 | 显示全部楼层
    VimVim 发表于 2018-12-26 06:37
    % d4 t- n! Z" c( B8 F1、正则的思路二楼已经说的很清楚了,这里再补充一点详细信息:
    . R* J1 @  c2 _5 z/ t% l
    好,有时间好好研究下。非常感谢,一下涨了不少知识。
    ! Z; ^4 J* |" ~# Y& r; @7 w* \% m; J. g8 B; [& }  d! I
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:27:15 | 显示全部楼层
    zzhirong 发表于 2018-12-26 10:02
    - |3 Q0 H+ T5 i1 l/ ]9 d6 X2 ~这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml  ...

    : |6 }) W$ J9 j- f前几天我在一个技术群里问正则的问题,里面一个大佬一直给我推荐xpath,说正则那是人用的东西么。哈哈哈9 F( C! b3 ^/ P) W& @+ ?
    找时间一定得研究下这东西,哈哈哈哈。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:27:52 | 显示全部楼层
    zzhirong 发表于 2018-12-26 10:02. c7 y) K* F# r( B9 {- Z
    这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml  ...

    & S+ l3 l& n& k+ Y感谢分享代码哈。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:28:31 | 显示全部楼层
    VimVim 发表于 2018-12-26 08:41
    9 @6 j. r  M7 Z0 F# Y' ?; B# U6 A两个方案的实施视频如附,即使不会用看看也过瘾:
    " n0 M0 l, g- x; A6 h/ G
    下下来看看
  • TA的每日心情
    无聊
    2022-9-25 21:09
  • 签到天数: 1136 天

    [LV.10]以坛为家III

    发表于 2018-12-26 22:03:28 | 显示全部楼层
    孤影 发表于 2018-12-25 20:11( k2 c! O, Z& S% x- G
    软件项目文件丢失了,不过你可以通过编辑器把全角的~替换成半角的~
      L. q0 e/ \* ?2 A% _) w: C
    有试过这方法,但是记得好像又有新的问题出现,我再找时间试试。谢谢。
  • TA的每日心情

    2023-7-4 23:24
  • 签到天数: 390 天

    [LV.9]以坛为家II

    发表于 2018-12-26 22:34:41 | 显示全部楼层
    jonah_w 发表于 2018-12-25 22:24
    . v0 v7 X3 w+ ~2 D7 m贪婪匹配就全乱了… title跟~对不上了…
    2 v% X5 \7 a' n& a& O+ m8 F
    不贪婪怎么匹配所有的~??要不你查一下~的unicode代码,直接转义匹配,看看会不会出错
  • TA的每日心情

    2023-7-4 23:24
  • 签到天数: 390 天

    [LV.9]以坛为家II

    发表于 2018-12-26 22:36:12 | 显示全部楼层
    jonah_w 发表于 2018-12-26 18:27
    3 |: Q; u; @7 ~前几天我在一个技术群里问正则的问题,里面一个大佬一直给我推荐xpath,说正则那是人用的东西么。哈哈哈
    , M. y# H: V. C) W, G ...
    ' v7 ]4 R5 `' y. t6 j# z5 A% ~
    正则还算友好,lisp才不是人用的
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-27 15:03:45 | 显示全部楼层
    leescott 发表于 2018-12-25 20:03  Z$ N6 M  U: ?( Y* F
    这种情况下,我喜欢用cnbook。
    ) {, |% `- B, n- J0 O复制原件到新建文本里面,替换\n为空。再把

    & m2 U- l4 L  P  U  C% [- Y% I我在Sublime编辑器里用正则替换,一共需要替换18万多个地方… 结果直接卡死… 如图。想把正则写在sed命令里,但不知道怎么写。求指教。& p# o2 l' q- T& o2 K1 t

    - M4 l4 P8 w3 m" L& Z5 L界面操作在量大的时候可用性指数下降… 1 j* U' ~+ F& `5 c" T& A
    / `4 h+ |3 M2 D2 w# Z3 l6 E5 V# U
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-28 18:08:57 | 显示全部楼层
    写出了连编辑器都害怕的正则 $ {8 v' E" z( h8 U8 i

    3 |" y3 X8 R: c" o* C8 D5 v1 v) K& H# |! \) F7 D
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 21:36:08 | 显示全部楼层
    孤影 发表于 2018-12-25 19:467 y5 b5 T0 E9 n2 d7 }/ E& H! ]
    我的软件不行吗?

    & }2 S$ i. c" m刚试了下孤影大大的小工具,好像不行,没有替换成功,虽然~没有了。 丢失了~前面的单词。
  • TA的每日心情
    开心
    2025-1-7 17:15
  • 签到天数: 773 天

    [LV.10]以坛为家III

    发表于 2018-12-30 22:09:10 | 显示全部楼层
    jonah_w 发表于 2018-12-30 12:36
    ; [& ?7 x" W# p, U/ d刚试了下孤影大大的小工具,好像不行,没有替换成功,虽然~没有了。 丢失了~前面的单词。 ...
    5 z/ x3 Z# S# u5 N- o
    发个测试文件看看
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 22:16:57 | 显示全部楼层
    孤影 发表于 2018-12-30 22:09
    7 M" P% P  D; {9 _发个测试文件看看

    0 p( g( S) X8 ?& D9 _
    , C  Q; U. n9 D7 a4 j$ C! J; {0 |6 k
    ; {6 M5 j& D' g2 ~  t2 E; f1 r9 _1 [0 ~% m. X$ V

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?免费注册

    x
  • TA的每日心情
    开心
    2025-1-7 17:15
  • 签到天数: 773 天

    [LV.10]以坛为家III

    发表于 2018-12-30 22:22:54 | 显示全部楼层
    & c. h% c4 W8 R& l. }" x: {
    老哥你这是什么东西?我的那个程序针对的是mdx源文件
    5 f4 w- w( [2 l" I' `5 n% t- @词头
    * Y, t* c' I4 C, a" V2 L。。。。。。。。。。。。。。。。。。。。
    # h: _0 x. L" y6 N</>$ r! a  x, R7 p

    + T# X( J  v& f0 K5 D7 _0 a
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 22:31:31 | 显示全部楼层
    孤影 发表于 2018-12-30 22:22
    ! Y. _) _+ {1 `: r8 r+ w- I老哥你这是什么东西?我的那个程序针对的是mdx源文件) N% Z  k* W4 ^6 c9 M
    词头
    + d. @; W2 L: E$ t; i& W* b。。。。。。。。。。。。。。。。。。。。

    1 a- b5 J, e( w8 K( Q, J, d
    4 z: ]* b9 U+ ~7 h7 g) Y2 @. B0 T! p) w9 b% y. V7 T  R" J
    好吧。这个是Mac词典源文件…
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    小黑屋|手机版|Archiver|PDAWIKI |网站地图

    GMT+8, 2025-7-10 13:35 , Processed in 0.023811 second(s), 16 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表