掌上百科 - 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:544 S; S) {+ V3 A3 n2 R6 a
    给你两个解决方案,均已测试通过!

    * e  y, O/ l( M4 T$ H! \- I( `. d因为图片和文档里说的要复制的内容好像不一致,两个都试了下:
    - k- {( |+ _8 V( A9 q第一种方案先通过 :let @a = '$2h"tyi"vit:s/\~^Rt/g^M/<d:entry^M':
    * `+ z$ y) R* z; D+ S复制进寄存器a 回车报错:invalid expression '$2h"tyi"vit:s/\~^Rt/g^M/<d:entry^M'
    ! I% s1 u+ P: }4 I. \! t换成let @a = '$2h"tyi"vit:s/\~/t/g /<d:entry' 没有报错。然后继续运行4@a,结果报错no range allowed$2h"tyi"vit:s/\~/t/g /<d:entry
    ( f. p, V* e9 C/ t  ~) n. H8 k5 ?
    第二种方案,同样输入:let @b = "vatgJn" 没报错。" }' C( F8 w: {* v
    再执行4@b 报错 Not an editor command: vatgJn
    6 r$ Y9 L# ?$ G4 c% @' T5 V1 \+ ?# Z$ K# n2 C
    不知道是不是我操作的问题。
    2 O' @" u8 V# F/ M, Z$ f( R对了,我在Mac电脑上操作的。用的MacVim软件
    : p/ U. |# c/ F1 q. {# X1 N
    0 @9 n  _7 O: j2 ]
  • TA的每日心情

    2025-7-22 06:07
  • 签到天数: 391 天

    [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:20- b0 n8 |5 ~6 F) k
    正则应该是可以做的,多用几个子单元应该就可以,从第一行的title关键字后取出单词,在/d之前的字段全部贪 ...

    : N+ b1 ]( ^7 Q* k贪婪匹配就全乱了… title跟~对不上了…
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    发表于 2018-12-25 22:56:24 | 显示全部楼层
    本帖最后由 VimVim 于 2018-12-25 23:04 编辑 " u. q; _# ?  o8 |" N# w
    jonah_w 发表于 2018-12-25 21:50
    + ]0 O( D$ F2 D# _; g  Q6 Q因为图片和文档里说的要复制的内容好像不一致,两个都试了下:4 `" \& y# h0 ?4 {
    第一种方案先通过 :let @a = '$2h"tyi"vit ...

    : p: ~; @4 ]0 ?2 ~$ x" G之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看到截图中的^R并不是常规的字符,而是在宏命令中的Ctrl+R
    : x# T/ Q/ w4 {4 P
    1 z) Z! _6 Q' q0 z6 {8 W! f: ~同时看你的截图跟我的截图不同,上述特殊字符在你的截图中看不见,可能是mac或vimrc配置的编码不同造成,你自己用qa录制出符合你系统的特殊字符,然后用"ap粘贴出来这些特殊字符,照我的截图补全即可。
    6 `5 u  e* X' g" l2 a
    . T+ w* Z: y6 B6 O+ w; |+ Z你只能通过yank命令来实现准确复制特殊字符,不要用let之类,如下两个步骤可实现复制:
    5 S8 w' y, e& M) D: d1、先把光标移到第一个字符$ ], p4 b. d3 h, T6 ?: ?6 W
    2、"ay$
    7 @  _" L" t( o4 t6 ]- z6 y( k* i& F6 a* `* K! c6 i
    无论如何,这是我觉得众多方法中最简洁的,而且不破坏原词典文件的排版格式。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 00:04:31 | 显示全部楼层
    VimVim 发表于 2018-12-25 22:56
    ) D# A8 Q% Z- O' q6 X之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看 ...

    1 E0 \* ^6 g+ W7 ?, x是正则的宏处理吗? 可不可以直接说下正则的思路,然后我试试在其他编辑器写出来,对vim尤其是宏这块完全陌生… 不知从何入手: x9 t0 _. Q/ Q/ V

    4 I# u1 B* A7 h. S
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 00:18:13 | 显示全部楼层
    VimVim 发表于 2018-12-25 22:56
    & {2 ?5 V; G" k! S% }( ~8 n# p之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看 ...
    $ T6 o( J! c. E7 i2 u. G4 [+ G
    另外 按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
    : q- a" M/ D5 ^4 n给你两个解决方案,均已测试通过!
    & \1 J2 i& Z5 p* ?) ]! X
    是在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 编辑
    8 p1 Q: x; c- h, N3 y% i6 \$ [+ z
    3 D8 x% v5 A9 I( N6 H. h2 {! j- \1 K
    1. (?<=<d:entry)([\s\S]*?title=")([^"]+)([\w\W]*)(~)([\s\S]*?)(?=</d:entry)
    复制代码

    + |# ^& K) P0 [换成
    1. \1\2\3\2\5
    复制代码

    9 J+ Q, N6 G" b$ g8 u/ p) {https://regex101.com/r/iWAJTc/1/+ K$ ]: Y6 X: \9 V* B/ }' f% W5 S

    ( k8 x. r# H2 B/ I. \- W我也凑个热闹……貌似可以,不过一次只能换掉一个。多个 ~ 就要点击多次。
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    发表于 2018-12-26 06:37:07 | 显示全部楼层
    本帖最后由 VimVim 于 2018-12-26 11:59 编辑 % L& ]) @6 X. L3 ?5 c
    jonah_w 发表于 2018-12-26 00:04
    8 ]4 b, M1 e4 ]7 @* x. K6 x" D是正则的宏处理吗? 可不可以直接说下正则的思路,然后我试试在其他编辑器写出来,对vim尤其是宏这块完全 ...
    + ^% e7 T2 e% f1 B; H
    1、正则的思路二楼已经说的很清楚了,这里再补充一点详细信息:2 w! o' i, w; I! B
    , d* ~% q" G# N* X( ?

    $ R- w- k9 Z2 K我只是照这个思路根据你的词典结构具体实现,并采用vim的替换功能,以及宏命令重复运行该替换操作。6 p" G. n7 |5 ~- p# t  y

    / C) d+ P1 m$ o8 k2 r- g" x6 I2、你只要:help usr_10即可获得关于本解决方案所需要的Vim基础知识* ^* k$ F" N3 N* _- B" W
    5 A8 O5 `6 t/ I! S
    3、补充方案一的具体思路:$ c% x0 q7 N, c+ _9 [5 v9 }, d
    $2h:定位光标到词条定义中/ j! U6 Y, J; Z2 ^. ^6 [
    "tyi":将词条复制进寄存器t(寓意title)
    8 f9 s4 q3 B& I2 Q; c" j' J) evit:选中当前位置所在标签所包围的内容5 ^, q. f. c7 i5 Q/ e0 V
    :s/\~/^Rt/g:在上述选区范围内进行搜索替换,将所有的~替换为寄存器t中的title内容(其中^R是指Ctrl+r,并非简单字符)6 D. Q9 g# P& k
    /<d:entry:搜索定位到下一个词条起始位置
    & P, }; y8 U; P' y) j* j3 V, S最后将上述指令放入寄存器中,并用宏命令@重复执行该寄存器的所有指令。. H" o6 y8 p1 d5 Z5 _
    5 w6 i, p7 @& H1 d6 _& Q

    . U: N) m5 q2 O/ W% F5 I  }4 i" r( |/ z0 l* K
    9 W/ V8 c% K% t2 n4 ~& T6 v
    0 c5 V8 V9 s7 B

    ( R6 y" B6 V1 @1 t0 Y1 z3 K+ W. O

    本帖子中包含更多资源

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

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

    [LV.7]常住居民III

    发表于 2018-12-26 08:41:09 | 显示全部楼层
    VimVim 发表于 2018-12-26 06:37
    5 n6 n3 f2 A1 j& o! {1、正则的思路二楼已经说的很清楚了。我只是照这个思路根据你的词典结构具体实现,并采用vim的替换功能, ...

    * x2 i4 {2 H( O1 _" y# v7 B两个方案的实施视频如附,即使不会用看看也过瘾:
    6 I4 y# q0 Y' g; A0 ?6 }& r

    本帖子中包含更多资源

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

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

    [LV.5]常住居民I

    发表于 2018-12-26 10:02:26 | 显示全部楼层
    这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml 库。
    , Q9 V# N! O4 f
    1. ! c) F+ }! _4 d) G" `7 i
    2. #!/usr/bin/env python2
      % i% v4 r' w& A0 g: F
    3. # -*- coding: utf-8 -*-0 p7 |7 ~7 o8 i; t! W
    4. """
      ! a) W% N. V' r& O0 o8 b, O% R
    5. File: replace_tilde_with_title.py9 e4 u, W, z4 v% y' e% c) p4 h
    6. Author: zzhirong. _0 b1 R3 m9 y
    7. Email: [email protected]
      4 m- L2 t2 J. B
    8. Description: 替换 span 下的 ~ 为 d:entry 的 d:title 属性! {" X5 W" w+ D' i, A
    9. """# a6 A' f4 Y; F/ j) B

    10. 0 o6 o* |3 E- b6 ]
    11. from lxml import etree* k( a8 b- J' y, ^4 Q9 x
    12. 6 B4 t0 m4 y2 G' i* M1 O6 I
    13. s = """<?xml version="1.0" encoding="UTF-8"?>" G3 s2 r8 W; R8 G. u, p7 Z3 I" a$ l
    14. <d:dictionary xmlns="http://www.w3.org/1999/xml" xmlns:d="http://www.apple.com/DTDs/DictionaryService-1.0.rng">* q: e5 [+ t, p. x; G  F
    15. <d:entry id="_38ja" d:title="xxx">* P( r5 Y" T3 K8 G; s
    16. <d:index d:value="steal" d:title="steal"/><span class="hw">steal</span><br/>+ \/ W, w- V2 i& H
    17. <span class="ex">~ a visit <span class="tag1">(an interview)</span> </span><span class="ex_c">测试<span class="tag1">(测试)</span></span>& @: o' Z/ `0 U( y6 a# {, F
    18. <span class="ex">~ a kiss </span><span class="ex_c">测试</span>
      ! N7 D% {1 |) A  m0 O) T: H
    19. <span class="ex">~ rides on the train </span><span class="ex_c">测试</span>
      3 N# B3 ~( D" v
    20. </d:entry>/ s0 j9 v. q4 [
    21. </d:dictionary>
      ' ?! ^1 \: _+ A' E' x# v" [
    22. """2 D* I6 v  d9 r# X0 T6 O: b+ z; u
    23. 2 _3 [4 g1 M* x' K8 M5 W  x
    24. xml = etree.XML(s)* j% t- |+ \' G/ L2 o9 n6 i9 t- C, S
    25. D_NS = xml.nsmap["d"]4 T8 W3 G! W8 H/ S6 W1 _& E
    26. XML_NS = xml.nsmap[None]  q9 H5 y' y' C1 L  N. |" ~
    27. . p" h  k) f2 ]1 q. }
    28. for entry in xml.xpath("//d:entry", namespaces={"d": xml.nsmap["d"]}):( m9 F) w, o5 }" ]$ N! Y3 Y3 G
    29.     title = entry.get("{%s}title" % D_NS, "")8 S, M* ]" q" y
    30.     for span in entry.iterfind("./{%s}span" % XML_NS):% d' J0 Q) q# L4 ]# y. u8 @! g
    31.         span.text = span.text.replace("~", title); W! M! q, N/ s8 M8 f- R
    32. print(etree.tostring(xml))2 W& \7 J+ e) v, K& U
    复制代码

    4 t+ |; V" ^* j5 I9 v* F

    本帖子中包含更多资源

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

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

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:25:34 | 显示全部楼层
    VimVim 发表于 2018-12-26 06:37
    , i. n) }6 l  [7 V( C" @% [8 e( u1、正则的思路二楼已经说的很清楚了,这里再补充一点详细信息:
    , x- H9 u$ w' |7 V
    好,有时间好好研究下。非常感谢,一下涨了不少知识。
    8 M' a& A4 V9 a- }" p$ U/ b
    5 I8 S* Z  z! [; m3 u) c
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:27:15 | 显示全部楼层
    zzhirong 发表于 2018-12-26 10:02* Q. O$ @8 ^: e: S( l
    这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml  ...

    1 N: a' q( R+ B! e/ l4 G  A- a前几天我在一个技术群里问正则的问题,里面一个大佬一直给我推荐xpath,说正则那是人用的东西么。哈哈哈
    0 ?! l" W% d/ N, P+ F2 b! _, d找时间一定得研究下这东西,哈哈哈哈。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:27:52 | 显示全部楼层
    zzhirong 发表于 2018-12-26 10:020 u7 T: Q& w0 S0 T( d9 {
    这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml  ...
    5 f" k; P9 H2 f2 T3 l( a# \0 X  z
    感谢分享代码哈。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:28:31 | 显示全部楼层
    VimVim 发表于 2018-12-26 08:41
    6 `7 o3 o4 L  [8 P( O' `, F两个方案的实施视频如附,即使不会用看看也过瘾:

    / ^6 I3 M: |0 v下下来看看
  • TA的每日心情
    无聊
    2022-9-25 21:09
  • 签到天数: 1136 天

    [LV.10]以坛为家III

    发表于 2018-12-26 22:03:28 | 显示全部楼层
    孤影 发表于 2018-12-25 20:11
    1 j7 v3 q4 V, M( _软件项目文件丢失了,不过你可以通过编辑器把全角的~替换成半角的~

    0 Q) v8 k( W3 f% N) v) {; O- d有试过这方法,但是记得好像又有新的问题出现,我再找时间试试。谢谢。
  • TA的每日心情

    2025-7-22 06:07
  • 签到天数: 391 天

    [LV.9]以坛为家II

    发表于 2018-12-26 22:34:41 | 显示全部楼层
    jonah_w 发表于 2018-12-25 22:24
    1 p/ X/ {; `2 P% f* ]# I贪婪匹配就全乱了… title跟~对不上了…

    3 F' e* K, f9 }: S8 J4 i5 i不贪婪怎么匹配所有的~??要不你查一下~的unicode代码,直接转义匹配,看看会不会出错
  • TA的每日心情

    2025-7-22 06:07
  • 签到天数: 391 天

    [LV.9]以坛为家II

    发表于 2018-12-26 22:36:12 | 显示全部楼层
    jonah_w 发表于 2018-12-26 18:27" C) o1 h0 j& K4 }
    前几天我在一个技术群里问正则的问题,里面一个大佬一直给我推荐xpath,说正则那是人用的东西么。哈哈哈( b' B) U$ {4 E1 ~- _) x
    ...
    6 o4 }' V- ?& T# |+ p2 ~
    正则还算友好,lisp才不是人用的
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-27 15:03:45 | 显示全部楼层
    leescott 发表于 2018-12-25 20:03  q  }# Z3 d( T
    这种情况下,我喜欢用cnbook。
    : T, v6 Y+ H4 l  r1 `! J. T复制原件到新建文本里面,替换\n为空。再把

    8 K1 S- M5 \+ _$ R3 m我在Sublime编辑器里用正则替换,一共需要替换18万多个地方… 结果直接卡死… 如图。想把正则写在sed命令里,但不知道怎么写。求指教。
    - Z" j; B  s: p8 A) N& Z
    ( V/ n) V- j( M! y) A7 s界面操作在量大的时候可用性指数下降… ' B  W* r+ e8 i0 t7 ~

    " u1 y% \6 y" }, L2 w  b& M
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-28 18:08:57 | 显示全部楼层
    写出了连编辑器都害怕的正则
    - x2 i( @: S2 W5 L% r7 N, }! K
    5 d) u- x2 G# Z4 o/ s7 n
    ) i8 T1 V2 T6 G* V2 }3 w
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 21:36:08 | 显示全部楼层
    孤影 发表于 2018-12-25 19:46# l4 {2 A* D8 x) J6 H
    我的软件不行吗?

    : K9 g0 X" @, K' u! z% A. J刚试了下孤影大大的小工具,好像不行,没有替换成功,虽然~没有了。 丢失了~前面的单词。
  • TA的每日心情
    开心
    2025-12-13 18:34
  • 签到天数: 796 天

    [LV.10]以坛为家III

    发表于 2018-12-30 22:09:10 | 显示全部楼层
    jonah_w 发表于 2018-12-30 12:36
    " H: ^+ |' r$ i2 l刚试了下孤影大大的小工具,好像不行,没有替换成功,虽然~没有了。 丢失了~前面的单词。 ...
    1 `9 B8 y( I$ U" W% v# n' ^
    发个测试文件看看
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 22:16:57 | 显示全部楼层
    孤影 发表于 2018-12-30 22:09
    # o$ T) B+ U0 X$ R0 y发个测试文件看看
    4 r* \5 W0 [& I4 r) G" ~

    8 i  K  K4 ?; O/ u6 t4 ~# `! R$ T  \+ j& P- a  g! }5 W/ t4 J

    ) F! s/ Z& j4 [+ F6 S; z- ~+ G

    本帖子中包含更多资源

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

    x
  • TA的每日心情
    开心
    2025-12-13 18:34
  • 签到天数: 796 天

    [LV.10]以坛为家III

    发表于 2018-12-30 22:22:54 | 显示全部楼层
    % L; W  a5 G5 _: C
    老哥你这是什么东西?我的那个程序针对的是mdx源文件
    & s6 D9 Y7 W9 u4 [词头
    # U. y% m* {' s* C( l+ t- i。。。。。。。。。。。。。。。。。。。。/ `3 f% s: g7 d
    </>& ^% j5 U) T! n( y

    2 s5 x% p* e+ `# X, w5 m# k/ {
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 22:31:31 | 显示全部楼层
    孤影 发表于 2018-12-30 22:22
    & o; N4 A7 S% F; h  |老哥你这是什么东西?我的那个程序针对的是mdx源文件' s  x! {$ K* g  G
    词头
    2 B" y. T+ Q* D. X$ Y8 C! p+ M。。。。。。。。。。。。。。。。。。。。

    6 a: R, k% \* A) B  w" T* u1 E5 O/ o7 t, `% ]' z4 h
    ' r9 X) h* l6 L, b3 R0 b- A
    好吧。这个是Mac词典源文件…
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

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

    GMT+8, 2026-6-5 06:38 , Processed in 0.021350 second(s), 16 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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