掌上百科 - 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% i4 f9 D4 ?# |2 n. E& [2 f2 H
    给你两个解决方案,均已测试通过!

    5 B7 P1 g& |  J% z( R2 L4 y因为图片和文档里说的要复制的内容好像不一致,两个都试了下:
    & i& U: m& J, [2 I第一种方案先通过 :let @a = '$2h"tyi"vit:s/\~^Rt/g^M/<d:entry^M':
    ; y) S  s, ]* k& Q' ~9 K复制进寄存器a 回车报错:invalid expression '$2h"tyi"vit:s/\~^Rt/g^M/<d:entry^M'0 Y2 v# |# t" g, W5 @% y
    换成let @a = '$2h"tyi"vit:s/\~/t/g /<d:entry' 没有报错。然后继续运行4@a,结果报错no range allowed$2h"tyi"vit:s/\~/t/g /<d:entry. e0 [8 H* m" h  M# C6 [

    . I* h7 C( v- K/ c" k第二种方案,同样输入:let @b = "vatgJn" 没报错。  h+ i  `6 C% N5 {' H9 w
    再执行4@b 报错 Not an editor command: vatgJn0 }* T/ i+ G$ t' v+ P
    ) N' F* N% a: n) A/ j
    不知道是不是我操作的问题。
    . P5 x& E: o0 P  K  q, c. b) P对了,我在Mac电脑上操作的。用的MacVim软件& W  W# o  V5 W5 r
    7 N7 Z& k0 c; v
  • 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:20" q* O  I0 o/ S+ Z2 L
    正则应该是可以做的,多用几个子单元应该就可以,从第一行的title关键字后取出单词,在/d之前的字段全部贪 ...

    ( n% B5 w' K+ J* M+ J* j% J* h+ b贪婪匹配就全乱了… title跟~对不上了…
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    发表于 2018-12-25 22:56:24 | 显示全部楼层
    本帖最后由 VimVim 于 2018-12-25 23:04 编辑
    , y9 J4 ^  }% n# u( M
    jonah_w 发表于 2018-12-25 21:50
    2 i( k5 n0 d2 M& r因为图片和文档里说的要复制的内容好像不一致,两个都试了下:( t! W. t( x) b7 @7 r
    第一种方案先通过 :let @a = '$2h"tyi"vit ...

      A) b& R9 b" t* i之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看到截图中的^R并不是常规的字符,而是在宏命令中的Ctrl+R
    ! {& s: s; m; B8 ?: a3 M
    1 O* U$ z+ M* r/ i2 p, T同时看你的截图跟我的截图不同,上述特殊字符在你的截图中看不见,可能是mac或vimrc配置的编码不同造成,你自己用qa录制出符合你系统的特殊字符,然后用"ap粘贴出来这些特殊字符,照我的截图补全即可。. Y2 z# m: F, K, K6 {2 [: D0 s
    1 }. t5 y, M  ^0 w/ k2 r
    你只能通过yank命令来实现准确复制特殊字符,不要用let之类,如下两个步骤可实现复制:6 |' ~2 p( E/ {  [7 I
    1、先把光标移到第一个字符  W  l' \7 Y+ S; X4 H7 j8 a5 i
    2、"ay$
    1 r  y: Q( J0 C6 ^5 M. L
    " u. Z2 a+ s; O( ]  n- f无论如何,这是我觉得众多方法中最简洁的,而且不破坏原词典文件的排版格式。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 00:04:31 | 显示全部楼层
    VimVim 发表于 2018-12-25 22:56
    . K' S2 ]7 Q+ i( Q之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看 ...
    + i# R0 R% B9 V9 D
    是正则的宏处理吗? 可不可以直接说下正则的思路,然后我试试在其他编辑器写出来,对vim尤其是宏这块完全陌生… 不知从何入手
      e$ x  B( x( T/ a* U+ o
    ( h! o' f4 a1 d& p; z
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 00:18:13 | 显示全部楼层
    VimVim 发表于 2018-12-25 22:56
    # z% m7 `/ D. D9 U0 l之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看 ...
    0 W. e+ i% n5 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( U. Z$ e7 ~& R
    给你两个解决方案,均已测试通过!

    ) X0 F$ A% w( E. }5 B) j是在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 编辑 : |- R  c( x0 l1 {# @$ y

    " w. ~" Z8 u  _" c! V
    1. (?<=<d:entry)([\s\S]*?title=")([^"]+)([\w\W]*)(~)([\s\S]*?)(?=</d:entry)
    复制代码
    8 D- n9 k- n( Z, f3 g" }1 p
    换成
    1. \1\2\3\2\5
    复制代码
    ) q2 U  m7 }1 T0 `3 _
    https://regex101.com/r/iWAJTc/1/, J1 J1 x8 D6 B' z9 R6 k
    & G, I; _8 v, s  R' A9 H
    我也凑个热闹……貌似可以,不过一次只能换掉一个。多个 ~ 就要点击多次。
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    发表于 2018-12-26 06:37:07 | 显示全部楼层
    本帖最后由 VimVim 于 2018-12-26 11:59 编辑 0 n- Q/ b: D" F1 U* g* D
    jonah_w 发表于 2018-12-26 00:04
    ( n& o: D, `" m2 d+ }1 [+ q3 M是正则的宏处理吗? 可不可以直接说下正则的思路,然后我试试在其他编辑器写出来,对vim尤其是宏这块完全 ...

    & I0 Z: H6 }* d7 D) T; {1、正则的思路二楼已经说的很清楚了,这里再补充一点详细信息:6 v  k7 y5 P8 n  e: U5 ?

    . N; ^; Q/ _9 y' m
    1 S: k) l1 Q9 t" {$ @$ Y我只是照这个思路根据你的词典结构具体实现,并采用vim的替换功能,以及宏命令重复运行该替换操作。
    & {! s) s6 ^1 }
    / h& m0 D" Q: S0 ?& E! l# U2、你只要:help usr_10即可获得关于本解决方案所需要的Vim基础知识
    3 h8 e0 N3 k: y2 A- G" H7 p! v3 z' r& D, ~: j# q+ B, q
    3、补充方案一的具体思路:
    8 D  Y2 ^/ v$ K: }/ |  S: y$2h:定位光标到词条定义中
    ( }& b( _1 ~' _* M% i/ {7 a"tyi":将词条复制进寄存器t(寓意title)
    * O1 |9 N6 A( W, P$ avit:选中当前位置所在标签所包围的内容8 r$ g2 z1 ^, V! g( n! N. E
    :s/\~/^Rt/g:在上述选区范围内进行搜索替换,将所有的~替换为寄存器t中的title内容(其中^R是指Ctrl+r,并非简单字符)3 M3 V9 w5 X2 u3 W
    /<d:entry:搜索定位到下一个词条起始位置
    1 J0 y" J" b( Y8 v) l最后将上述指令放入寄存器中,并用宏命令@重复执行该寄存器的所有指令。
    * t0 w1 f# w6 t
    8 h* V# v5 {! r
    # ~! ^* E/ F8 g$ \( t! y7 \
    : p2 d, |- u4 m6 c0 o! L1 o9 u
    , [4 C/ ~" C8 A+ N" r$ ^9 r( e- N8 Z- e

    0 _8 \, [4 f! O4 V

    本帖子中包含更多资源

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

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

    [LV.7]常住居民III

    发表于 2018-12-26 08:41:09 | 显示全部楼层
    VimVim 发表于 2018-12-26 06:37
    7 c' ?5 U( x; U3 k# ]8 o1、正则的思路二楼已经说的很清楚了。我只是照这个思路根据你的词典结构具体实现,并采用vim的替换功能, ...
    ! }; Y4 U; F6 ^) T
    两个方案的实施视频如附,即使不会用看看也过瘾:
    & C4 Z8 D& ?4 d( F) P% A

    本帖子中包含更多资源

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

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

    [LV.5]常住居民I

    发表于 2018-12-26 10:02:26 | 显示全部楼层
    这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml 库。" }) I8 {+ t  ^

    1. 1 h8 }8 B2 Z. Y2 ?8 k: M
    2. #!/usr/bin/env python2
      $ s, _7 q" i0 X8 |8 m8 a
    3. # -*- coding: utf-8 -*-" F# Z9 N2 S! C& M
    4. """
      # H3 G" T& _9 e) J
    5. File: replace_tilde_with_title.py7 k2 L% k( q% F0 h, Y8 k! m6 ]' z! A
    6. Author: zzhirong
      1 k' A; U9 N; f4 Q" r+ P
    7. Email: [email protected]
      * r- K  f1 E+ m7 a  Q
    8. Description: 替换 span 下的 ~ 为 d:entry 的 d:title 属性
      , Q6 W4 L0 M% ?- x+ i2 H. I" |7 {
    9. """0 T  I! u0 V$ ?

    10. * Z8 o% Z* x7 y
    11. from lxml import etree
      ! D1 l3 ]% q5 A. r6 r# \& Q
    12. + |/ C% N; `1 Q! d! l4 [7 w' }) B* e% N
    13. s = """<?xml version="1.0" encoding="UTF-8"?>
      $ M# W" ?3 [9 q* g5 [
    14. <d:dictionary xmlns="http://www.w3.org/1999/xml" xmlns:d="http://www.apple.com/DTDs/DictionaryService-1.0.rng">: k/ s( Q& ^7 x( \
    15. <d:entry id="_38ja" d:title="xxx">
      " D  m6 C3 S+ I) A5 r
    16. <d:index d:value="steal" d:title="steal"/><span class="hw">steal</span><br/>
      % e; R. }& x9 q, H
    17. <span class="ex">~ a visit <span class="tag1">(an interview)</span> </span><span class="ex_c">测试<span class="tag1">(测试)</span></span>
        H0 ^: Y# X) W0 f* Y
    18. <span class="ex">~ a kiss </span><span class="ex_c">测试</span>- c1 p  m  N' E
    19. <span class="ex">~ rides on the train </span><span class="ex_c">测试</span>! R/ M1 p1 I9 I- I$ p6 G
    20. </d:entry>
      , c* C# }  z/ ~, _! k& x+ A& y
    21. </d:dictionary>
      ! A) K; f! ]9 C* k
    22. """
      7 O7 `8 r* b5 j% q" Z! h

    23. $ v2 o" p: z+ b$ c5 a
    24. xml = etree.XML(s)  ^5 {2 `' o' w* }/ V" e  H
    25. D_NS = xml.nsmap["d"]7 u. C  @# A% {, ?$ y
    26. XML_NS = xml.nsmap[None]
      5 W. w2 a' Y8 c7 Y3 ?

    27. ( W7 W4 I7 e1 p7 F' m
    28. for entry in xml.xpath("//d:entry", namespaces={"d": xml.nsmap["d"]}):
      - N: U7 x2 A9 h
    29.     title = entry.get("{%s}title" % D_NS, "")- e: A6 L4 E/ I
    30.     for span in entry.iterfind("./{%s}span" % XML_NS):3 G& T* a! ~8 m& R1 E/ A7 R5 ]
    31.         span.text = span.text.replace("~", title)8 y/ e, h5 O, F: {
    32. print(etree.tostring(xml))& X2 j% L$ j1 T: t
    复制代码
    - W) g/ e2 O. _+ P0 N/ n. y

    本帖子中包含更多资源

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

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

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:25:34 | 显示全部楼层
    VimVim 发表于 2018-12-26 06:37( J  s+ f# J- a5 t. [
    1、正则的思路二楼已经说的很清楚了,这里再补充一点详细信息:

    4 D* E- R% Y% [好,有时间好好研究下。非常感谢,一下涨了不少知识。7 N, S* E+ m3 I; O" ?& u  i6 R0 d1 P

    * S- m. O! [0 M$ S# U9 K1 F4 t3 Q
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:27:15 | 显示全部楼层
    zzhirong 发表于 2018-12-26 10:026 c0 `- ^. ~% c  X0 D2 q8 o
    这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml  ...
    0 V- V4 F8 t8 m$ R5 w6 c
    前几天我在一个技术群里问正则的问题,里面一个大佬一直给我推荐xpath,说正则那是人用的东西么。哈哈哈1 S" D2 r, Q1 O! {
    找时间一定得研究下这东西,哈哈哈哈。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:27:52 | 显示全部楼层
    zzhirong 发表于 2018-12-26 10:02
    0 P$ W8 P+ s$ i9 ~这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml  ...

    ( U: }' q5 ^- [/ u5 v# H感谢分享代码哈。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:28:31 | 显示全部楼层
    VimVim 发表于 2018-12-26 08:418 H. E( z* P# L4 }" c& N
    两个方案的实施视频如附,即使不会用看看也过瘾:

    7 H, z% H: Z' I9 Y下下来看看
  • TA的每日心情
    无聊
    2022-9-25 21:09
  • 签到天数: 1136 天

    [LV.10]以坛为家III

    发表于 2018-12-26 22:03:28 | 显示全部楼层
    孤影 发表于 2018-12-25 20:11/ Y$ e& O7 J8 Z; r! P
    软件项目文件丢失了,不过你可以通过编辑器把全角的~替换成半角的~

    6 C: r, ?5 B. w  v/ ]有试过这方法,但是记得好像又有新的问题出现,我再找时间试试。谢谢。
  • TA的每日心情

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

    [LV.9]以坛为家II

    发表于 2018-12-26 22:34:41 | 显示全部楼层
    jonah_w 发表于 2018-12-25 22:24
    , @) I% {4 _- B6 z, k" X贪婪匹配就全乱了… title跟~对不上了…

    4 h. }4 ~+ m% m7 ]6 ^$ F  y不贪婪怎么匹配所有的~??要不你查一下~的unicode代码,直接转义匹配,看看会不会出错
  • TA的每日心情

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

    [LV.9]以坛为家II

    发表于 2018-12-26 22:36:12 | 显示全部楼层
    jonah_w 发表于 2018-12-26 18:27
    ' [+ {9 x4 H- |5 \前几天我在一个技术群里问正则的问题,里面一个大佬一直给我推荐xpath,说正则那是人用的东西么。哈哈哈
    & i, r+ ^" S* ~ ...
    : v4 T/ A3 J9 q1 _# D$ \4 \! R
    正则还算友好,lisp才不是人用的
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-27 15:03:45 | 显示全部楼层
    leescott 发表于 2018-12-25 20:03% a* E% N' k0 U, K0 c6 d% ~% Q
    这种情况下,我喜欢用cnbook。
    4 z) G& l- J6 ~5 B复制原件到新建文本里面,替换\n为空。再把
    , e* O3 y& ]; y: O, M
    我在Sublime编辑器里用正则替换,一共需要替换18万多个地方… 结果直接卡死… 如图。想把正则写在sed命令里,但不知道怎么写。求指教。5 G0 M. i3 A" p: H% q7 F  P
    2 }* j* ]2 m+ ?# a
    界面操作在量大的时候可用性指数下降… " B6 E4 l# h4 h8 q4 f

    4 Z4 ?4 B) `+ X3 v$ k
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-28 18:08:57 | 显示全部楼层
    写出了连编辑器都害怕的正则
    * E' B6 D0 g. f1 F, I: u' E/ S' L* x- P) U& |. ], Z

    + W/ Q+ C3 K+ S1 K3 W5 t5 T
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 21:36:08 | 显示全部楼层
    孤影 发表于 2018-12-25 19:46
    ; k8 o' J% p" _$ E我的软件不行吗?
    ) u. {' _7 |  x. M' v" r
    刚试了下孤影大大的小工具,好像不行,没有替换成功,虽然~没有了。 丢失了~前面的单词。
  • TA的每日心情
    开心
    昨天 23:16
  • 签到天数: 761 天

    [LV.10]以坛为家III

    发表于 2018-12-30 22:09:10 | 显示全部楼层
    jonah_w 发表于 2018-12-30 12:36
    / w* S* e+ T* l( y. i6 O刚试了下孤影大大的小工具,好像不行,没有替换成功,虽然~没有了。 丢失了~前面的单词。 ...
    # u5 E# l- W; c# F
    发个测试文件看看
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 22:16:57 | 显示全部楼层
    孤影 发表于 2018-12-30 22:09
    , s6 G) i7 V4 G" |+ }发个测试文件看看

    + e" _( B" p; ?2 G1 [9 D& R* B) z! X9 A$ s+ f  [+ n6 M

    + ~, ]3 \  o( g; a' w; N+ p
    $ o$ u0 K$ e* p" H

    本帖子中包含更多资源

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

    x
  • TA的每日心情
    开心
    昨天 23:16
  • 签到天数: 761 天

    [LV.10]以坛为家III

    发表于 2018-12-30 22:22:54 | 显示全部楼层
    * K4 M) e; h! ^0 f8 G$ ?
    老哥你这是什么东西?我的那个程序针对的是mdx源文件7 ]  D4 n& v, R
    词头& A9 c# x# b/ g  @" x8 t  d, C
    。。。。。。。。。。。。。。。。。。。。
    # ^3 O# o+ ~4 e2 ]+ U+ k</>
    , e( U3 o* [" ]3 o- r( n, H
    5 g3 W( S* h. Z
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 22:31:31 | 显示全部楼层
    孤影 发表于 2018-12-30 22:22
    / H+ k4 S! v! I3 V3 m0 t老哥你这是什么东西?我的那个程序针对的是mdx源文件
    0 \* C- c4 Y, S3 ]词头
    3 i) |( ?$ M+ d6 @# I" P& f。。。。。。。。。。。。。。。。。。。。
    3 s, p9 N! D6 p

    ( |7 S2 n6 C. H  O) k3 w+ \- \2 @+ }* y+ m) f+ g* s% G
    好吧。这个是Mac词典源文件…
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

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

    GMT+8, 2024-6-4 01:43 , Processed in 0.056209 second(s), 6 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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