掌上百科 - 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
    8 K) v/ B' ~! S3 j0 K, h给你两个解决方案,均已测试通过!

    ! X4 m5 i) _1 _# A2 B  C因为图片和文档里说的要复制的内容好像不一致,两个都试了下:# P- o. x* Z1 ]5 [; l5 e7 `
    第一种方案先通过 :let @a = '$2h"tyi"vit:s/\~^Rt/g^M/<d:entry^M':" M& l( G3 u" e/ a. i: k
    复制进寄存器a 回车报错:invalid expression '$2h"tyi"vit:s/\~^Rt/g^M/<d:entry^M'
    , N) [% `9 ^. H$ t" o5 A8 Y换成let @a = '$2h"tyi"vit:s/\~/t/g /<d:entry' 没有报错。然后继续运行4@a,结果报错no range allowed$2h"tyi"vit:s/\~/t/g /<d:entry! V0 O; Y: }) ?" O
    # \$ x; Y0 [2 [/ x& @
    第二种方案,同样输入:let @b = "vatgJn" 没报错。
    & {( G* ?' n( w再执行4@b 报错 Not an editor command: vatgJn$ C$ \$ }; `. d. h6 ]' N8 k
    $ T0 N  i) ]4 i
    不知道是不是我操作的问题。( K4 a+ M2 J9 E: m( L5 m
    对了,我在Mac电脑上操作的。用的MacVim软件9 |5 a7 H2 r% L# w& {+ e

    7 Z" T; T7 N  I  a* H
  • 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:202 X( h, F1 N6 z5 o0 S& |+ c1 U
    正则应该是可以做的,多用几个子单元应该就可以,从第一行的title关键字后取出单词,在/d之前的字段全部贪 ...
    1 N& A, U, O# b4 S0 _$ Q
    贪婪匹配就全乱了… title跟~对不上了…
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    发表于 2018-12-25 22:56:24 | 显示全部楼层
    本帖最后由 VimVim 于 2018-12-25 23:04 编辑 , _/ B, P; E% S, c4 ^/ z
    jonah_w 发表于 2018-12-25 21:509 @. C8 b/ Q3 S9 A
    因为图片和文档里说的要复制的内容好像不一致,两个都试了下:
    & W) Z, {; c! u第一种方案先通过 :let @a = '$2h"tyi"vit ...
    / ^# e& C: l+ S0 T+ m9 `/ i) X
    之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看到截图中的^R并不是常规的字符,而是在宏命令中的Ctrl+R
    / {. ~, S' Q" s' C. C3 v2 e# u1 t' P# ^! {
    同时看你的截图跟我的截图不同,上述特殊字符在你的截图中看不见,可能是mac或vimrc配置的编码不同造成,你自己用qa录制出符合你系统的特殊字符,然后用"ap粘贴出来这些特殊字符,照我的截图补全即可。% J. ?' H& u" ]5 B

    : m7 I: ~; R  X你只能通过yank命令来实现准确复制特殊字符,不要用let之类,如下两个步骤可实现复制:
    ( t- P: o. V; k1、先把光标移到第一个字符
    % U; {% H* H' w' c( g# N/ z2、"ay$) g( x7 Y( T+ @% b

    4 @$ F2 y; O. g6 b7 ]9 u% h无论如何,这是我觉得众多方法中最简洁的,而且不破坏原词典文件的排版格式。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 00:04:31 | 显示全部楼层
    VimVim 发表于 2018-12-25 22:56
    7 v6 p/ v. O3 V0 }3 Q" Y之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看 ...

    3 g/ }$ A+ m% ~+ v- x) p是正则的宏处理吗? 可不可以直接说下正则的思路,然后我试试在其他编辑器写出来,对vim尤其是宏这块完全陌生… 不知从何入手
    + i4 i: @! s' p, L( s; S0 v0 Y
    ; q* S. |2 j1 J; x0 a
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 00:18:13 | 显示全部楼层
    VimVim 发表于 2018-12-25 22:56
    4 [5 _0 i* [, B之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看 ...
    / N$ C, p" P( g, V0 l- N
    另外 按999@a 以后进入了visual模式 是不是有问题
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 00:27:32 | 显示全部楼层
    VimVim 发表于 2018-12-25 17:547 B7 q- d- h, B  u. q9 r
    给你两个解决方案,均已测试通过!
      P5 Q8 f) Z# M
    是在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 编辑 & A7 r- `1 S+ M4 |7 Y

    , ~5 v# ?& g, g
    1. (?<=<d:entry)([\s\S]*?title=")([^"]+)([\w\W]*)(~)([\s\S]*?)(?=</d:entry)
    复制代码
    , H4 {( x& a' R: }& }
    换成
    1. \1\2\3\2\5
    复制代码

    ( _: }# }7 Y' X( ]https://regex101.com/r/iWAJTc/1/  S  x: Y$ x/ t4 {7 ^
    - F8 b7 {6 r$ k  U! O, z* w; W, |
    我也凑个热闹……貌似可以,不过一次只能换掉一个。多个 ~ 就要点击多次。
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    发表于 2018-12-26 06:37:07 | 显示全部楼层
    本帖最后由 VimVim 于 2018-12-26 11:59 编辑
    6 N  w7 f9 u+ n0 d
    jonah_w 发表于 2018-12-26 00:04
    ) _5 e5 x9 Q1 \是正则的宏处理吗? 可不可以直接说下正则的思路,然后我试试在其他编辑器写出来,对vim尤其是宏这块完全 ...
    % ^  w1 i) j, z# x* `, ]
    1、正则的思路二楼已经说的很清楚了,这里再补充一点详细信息:6 S7 x, w6 S% m* U8 P2 S8 q7 j" h1 ]
    ( A, V( I) m$ b

    0 {5 J5 `: Q5 N5 J7 X7 d: E我只是照这个思路根据你的词典结构具体实现,并采用vim的替换功能,以及宏命令重复运行该替换操作。
    - R8 v: Z; R2 T5 N
    ' L1 [9 P! {  R7 w, c$ P2、你只要:help usr_10即可获得关于本解决方案所需要的Vim基础知识
    / ^7 p2 N) d6 R# m% K! f, A  l1 u" F% R% \! K, m
    3、补充方案一的具体思路:9 o; M5 `2 j* Q7 o" S8 L' T
    $2h:定位光标到词条定义中
      [7 [* B7 j( q/ b4 Q"tyi":将词条复制进寄存器t(寓意title)+ e# w+ T+ [6 X$ ^) E8 C7 v
    vit:选中当前位置所在标签所包围的内容
    : X, i2 ]! Q' n7 x* B/ E:s/\~/^Rt/g:在上述选区范围内进行搜索替换,将所有的~替换为寄存器t中的title内容(其中^R是指Ctrl+r,并非简单字符)
    & x8 S0 {/ p  \4 t/ r( a/<d:entry:搜索定位到下一个词条起始位置- e  Q# X: \% A8 w
    最后将上述指令放入寄存器中,并用宏命令@重复执行该寄存器的所有指令。
    . s- `$ c; L2 `
    - k5 f6 i- j7 F. G) d) N" J+ t8 n* t7 c$ G& K

    / @* g! ~% c, U7 [8 l8 c. B' {, W; R) h1 {; O
    8 u7 s" B8 l5 U. E, G4 R. x

    7 d& N, E- z, U% U$ K2 _) I& A

    本帖子中包含更多资源

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

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

    [LV.7]常住居民III

    发表于 2018-12-26 08:41:09 | 显示全部楼层
    VimVim 发表于 2018-12-26 06:37
    3 J* u+ }5 S2 E! s; r4 z1、正则的思路二楼已经说的很清楚了。我只是照这个思路根据你的词典结构具体实现,并采用vim的替换功能, ...
    ) @' H4 q" T  _1 D1 J8 c
    两个方案的实施视频如附,即使不会用看看也过瘾:
    # d% a, g9 B5 k$ D

    本帖子中包含更多资源

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

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

    [LV.5]常住居民I

    发表于 2018-12-26 10:02:26 | 显示全部楼层
    这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml 库。) B4 q) V# `) k4 J2 i/ _0 y5 f+ w

    1. " F$ T  a5 B. e. ]5 P( E  w
    2. #!/usr/bin/env python2
      . B$ b$ }/ a% ~. B9 b! T; c
    3. # -*- coding: utf-8 -*-0 h# }8 t, Y, F/ N1 V- L1 d
    4. """
      6 g' @- H; U+ _  f; }, G4 m
    5. File: replace_tilde_with_title.py
      ( U) e/ I) H& d
    6. Author: zzhirong. i& ~$ D0 U9 i* i  O. [2 ^
    7. Email: zzhirong@email.com
      4 W- s) t( d$ ^! T
    8. Description: 替换 span 下的 ~ 为 d:entry 的 d:title 属性
      % p$ c2 T% y' ]& {1 W
    9. """, c9 g" L/ H$ I( |! d

    10. 6 H' a( ^5 M7 K6 s! y( k$ K% n
    11. from lxml import etree9 x1 e: h6 r& w% z3 q

    12. , H0 K' D7 M5 H8 V5 m
    13. s = """<?xml version="1.0" encoding="UTF-8"?>
      ! o9 c" W1 f0 K! z7 r
    14. <d:dictionary xmlns="http://www.w3.org/1999/xml" xmlns:d="http://www.apple.com/DTDs/DictionaryService-1.0.rng">& J" o" g6 v% b6 N
    15. <d:entry id="_38ja" d:title="xxx">$ B+ g: d0 ?5 D4 c: }5 M
    16. <d:index d:value="steal" d:title="steal"/><span class="hw">steal</span><br/>
      0 ?$ i9 J/ O3 O/ i" f: V. v
    17. <span class="ex">~ a visit <span class="tag1">(an interview)</span> </span><span class="ex_c">测试<span class="tag1">(测试)</span></span>2 l2 ^) p! G, Q, C9 ?& R/ l# D
    18. <span class="ex">~ a kiss </span><span class="ex_c">测试</span>9 `3 [3 `& l$ [. w0 I
    19. <span class="ex">~ rides on the train </span><span class="ex_c">测试</span># Y0 Y# h+ j% R3 ~
    20. </d:entry>
      " _+ i# S4 p& D
    21. </d:dictionary>9 o: m2 ~, ^: ]' y2 y; k$ C% ~+ C
    22. """0 E! b' m! t) e# J4 ]
    23. 9 o8 i/ J) h8 J3 }
    24. xml = etree.XML(s)
      2 A: t( k% H* S
    25. D_NS = xml.nsmap["d"]
      - f# j2 l: f8 Z' W
    26. XML_NS = xml.nsmap[None]
      . A9 I* o+ I/ N+ n, f  L. B

    27.   E$ J5 ~( a- V5 h0 r8 {
    28. for entry in xml.xpath("//d:entry", namespaces={"d": xml.nsmap["d"]}):
      * u6 t  S8 ?- `, u7 g( y) f1 N/ a2 X
    29.     title = entry.get("{%s}title" % D_NS, "")
      # w4 r6 _* P' o# B5 c  z
    30.     for span in entry.iterfind("./{%s}span" % XML_NS):8 }; E$ Q. Y: w# g; H& r
    31.         span.text = span.text.replace("~", title). A" J' A% M% U: ~; k  X5 b
    32. print(etree.tostring(xml))
      5 x; B4 U  N4 x# J5 o& S
    复制代码

    1 t: E) g" o4 Q% O: J: Q1 k0 w1 N0 Q

    本帖子中包含更多资源

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

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

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:25:34 | 显示全部楼层
    VimVim 发表于 2018-12-26 06:37
    / v0 |1 v3 }/ _: z" q0 C) H1、正则的思路二楼已经说的很清楚了,这里再补充一点详细信息:

    / B+ H2 c7 S# N4 C, n好,有时间好好研究下。非常感谢,一下涨了不少知识。
    4 M- P) H7 {8 L
    , N: u( k% o) l& L3 i9 q
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:27:15 | 显示全部楼层
    zzhirong 发表于 2018-12-26 10:02% M" g9 l' z8 b) r0 ?
    这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml  ...

    - b0 p' R6 E9 D5 k& A% h前几天我在一个技术群里问正则的问题,里面一个大佬一直给我推荐xpath,说正则那是人用的东西么。哈哈哈
    2 Q* V  B0 N1 ^7 d% h4 G: V1 T& h8 P/ z找时间一定得研究下这东西,哈哈哈哈。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:27:52 | 显示全部楼层
    zzhirong 发表于 2018-12-26 10:02
    . Y% H7 F& l6 B% h这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml  ...
    2 T6 a; N1 Z  V$ s, s
    感谢分享代码哈。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:28:31 | 显示全部楼层
    VimVim 发表于 2018-12-26 08:41
    8 H: W! O" f& Q' U0 v两个方案的实施视频如附,即使不会用看看也过瘾:

    * k# g5 v$ T  e1 i  d下下来看看
  • TA的每日心情
    无聊
    2022-9-25 21:09
  • 签到天数: 1136 天

    [LV.10]以坛为家III

    发表于 2018-12-26 22:03:28 | 显示全部楼层
    孤影 发表于 2018-12-25 20:11
    # H) T  }0 c* k1 i软件项目文件丢失了,不过你可以通过编辑器把全角的~替换成半角的~

      ?% k& r2 E: T7 ?* ?有试过这方法,但是记得好像又有新的问题出现,我再找时间试试。谢谢。
  • TA的每日心情

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

    [LV.9]以坛为家II

    发表于 2018-12-26 22:34:41 | 显示全部楼层
    jonah_w 发表于 2018-12-25 22:24
    . c1 e- d$ m: M8 q4 P贪婪匹配就全乱了… title跟~对不上了…

    ; l1 s* F/ K1 T7 e6 r6 p( u不贪婪怎么匹配所有的~??要不你查一下~的unicode代码,直接转义匹配,看看会不会出错
  • TA的每日心情

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

    [LV.9]以坛为家II

    发表于 2018-12-26 22:36:12 | 显示全部楼层
    jonah_w 发表于 2018-12-26 18:27
    2 X) [0 t& v" T前几天我在一个技术群里问正则的问题,里面一个大佬一直给我推荐xpath,说正则那是人用的东西么。哈哈哈7 C: ^5 [9 U0 D" Y) R
    ...

    6 a" B3 Z3 w. n3 _6 s) C" e+ b正则还算友好,lisp才不是人用的
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-27 15:03:45 | 显示全部楼层
    leescott 发表于 2018-12-25 20:033 y1 i" @3 h1 i8 Z1 P7 M
    这种情况下,我喜欢用cnbook。: ]2 G* s4 D1 Y
    复制原件到新建文本里面,替换\n为空。再把

    8 n8 x9 d, o7 k/ s5 B我在Sublime编辑器里用正则替换,一共需要替换18万多个地方… 结果直接卡死… 如图。想把正则写在sed命令里,但不知道怎么写。求指教。
    # M/ s* \1 n, `7 w3 V
    ' G8 s3 i( t  F$ \, e' e, O7 j界面操作在量大的时候可用性指数下降… 8 }) M$ \+ Q* f

    2 x" z- A, c5 K* O. `+ \- M
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-28 18:08:57 | 显示全部楼层
    写出了连编辑器都害怕的正则 : _5 e2 v+ c$ F) W" H5 a' B
      c) c6 j# z. v! d. w, L

    5 G, `1 @" [+ s+ y
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 21:36:08 | 显示全部楼层
    孤影 发表于 2018-12-25 19:46
    3 L2 c  U/ a8 x6 B8 w( w我的软件不行吗?

    ( `6 O8 K4 |  E2 s刚试了下孤影大大的小工具,好像不行,没有替换成功,虽然~没有了。 丢失了~前面的单词。
  • TA的每日心情
    开心
    2025-1-7 17:15
  • 签到天数: 773 天

    [LV.10]以坛为家III

    发表于 2018-12-30 22:09:10 | 显示全部楼层
    jonah_w 发表于 2018-12-30 12:36
    7 n5 ?- e# ?8 b8 o( l+ E" n, p4 O刚试了下孤影大大的小工具,好像不行,没有替换成功,虽然~没有了。 丢失了~前面的单词。 ...

    " y; W$ s2 d8 {发个测试文件看看
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 22:16:57 | 显示全部楼层
    孤影 发表于 2018-12-30 22:092 o5 v& d- P* Y- K: b" P
    发个测试文件看看

    8 a) j$ s$ ?) |3 d4 _1 ^! R! z8 H& k$ N8 T5 O
    1 s+ g0 X0 K1 r( J2 n

    # c5 ~9 v: [& K: M; w

    本帖子中包含更多资源

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

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

    [LV.10]以坛为家III

    发表于 2018-12-30 22:22:54 | 显示全部楼层

    2 M  r, o! a( m+ L# y% N6 R老哥你这是什么东西?我的那个程序针对的是mdx源文件
    % y& B. h. q8 r" Q词头0 z+ x3 x% R* k9 p/ j& {
    。。。。。。。。。。。。。。。。。。。。
    ( q! k. r' V1 d( l1 O, ~. R, L7 z' `</>
    , W, i% f: A1 r& p; }6 x1 R$ C+ x' M, W) e" S# S+ _! t3 W
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 22:31:31 | 显示全部楼层
    孤影 发表于 2018-12-30 22:22. D7 J. N( n1 t& V) z
    老哥你这是什么东西?我的那个程序针对的是mdx源文件4 W' W' m9 x- [' v, e7 j! d
    词头; O" N$ ^0 e& k
    。。。。。。。。。。。。。。。。。。。。

    * W9 {& B, z, t0 X3 G  t# d2 \: `$ c. O  H

    " |$ J  m+ s% ~: v好吧。这个是Mac词典源文件…
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

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

    GMT+8, 2025-5-23 06:07 , Processed in 0.021532 second(s), 16 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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