掌上百科 - 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:545 l6 b" x+ R2 a: }, s7 S2 c5 p
    给你两个解决方案,均已测试通过!
    - @0 b! ]( g" S, b/ g
    因为图片和文档里说的要复制的内容好像不一致,两个都试了下:
    : {  X6 A7 N" k: e7 y第一种方案先通过 :let @a = '$2h"tyi"vit:s/\~^Rt/g^M/<d:entry^M':
    7 K+ j4 p2 r4 R0 {复制进寄存器a 回车报错:invalid expression '$2h"tyi"vit:s/\~^Rt/g^M/<d:entry^M'
    $ M' V# {2 A( Q/ X# B/ V换成let @a = '$2h"tyi"vit:s/\~/t/g /<d:entry' 没有报错。然后继续运行4@a,结果报错no range allowed$2h"tyi"vit:s/\~/t/g /<d:entry
    ( O' R: R) m- [5 q
    / z1 D9 n$ a, R- B) d  ]% |8 g第二种方案,同样输入:let @b = "vatgJn" 没报错。) n3 ~- f& t, k, ~' z; V* ]: ?
    再执行4@b 报错 Not an editor command: vatgJn
    , A* W- |* @6 c3 B4 Z8 J6 Z  W) `: W
    不知道是不是我操作的问题。
    0 M6 o! s  [2 M对了,我在Mac电脑上操作的。用的MacVim软件, g8 s  z! @/ o6 I# |. S" |& [
    0 i# R6 y" O* M# B* K- h
  • 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:206 v* O% b) B; u6 S& T. e
    正则应该是可以做的,多用几个子单元应该就可以,从第一行的title关键字后取出单词,在/d之前的字段全部贪 ...

    7 q2 k( v* E9 s6 d9 n3 M' R% J贪婪匹配就全乱了… title跟~对不上了…
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    发表于 2018-12-25 22:56:24 | 显示全部楼层
    本帖最后由 VimVim 于 2018-12-25 23:04 编辑 ' A+ B7 l, W( d4 @( L+ {( ^8 x0 b
    jonah_w 发表于 2018-12-25 21:50
    1 r+ O. f0 W2 Q; C因为图片和文档里说的要复制的内容好像不一致,两个都试了下:
    ; j  G9 j, w( K第一种方案先通过 :let @a = '$2h"tyi"vit ...

    8 i1 c+ ^" J/ r! ]/ j4 x之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看到截图中的^R并不是常规的字符,而是在宏命令中的Ctrl+R; Y# K1 o4 ]" |6 u" q3 g" I

    6 w$ S7 e3 H) k! w) X8 p同时看你的截图跟我的截图不同,上述特殊字符在你的截图中看不见,可能是mac或vimrc配置的编码不同造成,你自己用qa录制出符合你系统的特殊字符,然后用"ap粘贴出来这些特殊字符,照我的截图补全即可。
    + T1 \0 @' j0 X0 [5 Q) T2 x7 M6 |0 _! S( n) W" Y3 J( g
    你只能通过yank命令来实现准确复制特殊字符,不要用let之类,如下两个步骤可实现复制:6 m  J& a$ B7 R4 ^! b
    1、先把光标移到第一个字符0 L# d$ Q5 d. d0 C' F( V# }( G
    2、"ay$
    - n$ H2 ?% o* B  I: H! G! r$ G  b; y  ]- {- m- B6 E
    无论如何,这是我觉得众多方法中最简洁的,而且不破坏原词典文件的排版格式。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 00:04:31 | 显示全部楼层
    VimVim 发表于 2018-12-25 22:56% w6 b, ^, u: |9 T/ l& [
    之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看 ...
    9 ?: v" D/ E. h, D
    是正则的宏处理吗? 可不可以直接说下正则的思路,然后我试试在其他编辑器写出来,对vim尤其是宏这块完全陌生… 不知从何入手# N, j' ^* ]' X( w% ^* b( G7 e

    , E; V8 i; w- O; p% ^8 L$ Q
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 00:18:13 | 显示全部楼层
    VimVim 发表于 2018-12-25 22:56* }' Z1 _  g* I; e2 l( q( P( D/ S' D
    之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看 ...
    8 v" V: {- i. N2 H; C$ o" ^% 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:54# e6 v2 D: ]0 b5 [! g
    给你两个解决方案,均已测试通过!
    ' z% D( M+ O8 J( Y& _' a
    是在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 编辑 - t8 v% n" L  m5 _

    # g0 L4 y5 r/ W) t- I2 [搜
    1. (?<=<d:entry)([\s\S]*?title=")([^"]+)([\w\W]*)(~)([\s\S]*?)(?=</d:entry)
    复制代码
    0 Y* @9 v' K& |/ c( @; h$ {
    换成
    1. \1\2\3\2\5
    复制代码

    ' |: y# x3 B/ `& ^https://regex101.com/r/iWAJTc/1/
    8 @: T6 ^! V+ ^* |1 u+ Q0 r  ~' W7 i7 v  i* M! @- n' m
    我也凑个热闹……貌似可以,不过一次只能换掉一个。多个 ~ 就要点击多次。
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    发表于 2018-12-26 06:37:07 | 显示全部楼层
    本帖最后由 VimVim 于 2018-12-26 11:59 编辑 6 e: G/ s; l5 [
    jonah_w 发表于 2018-12-26 00:04
    # m: B- c- G' z, C9 l是正则的宏处理吗? 可不可以直接说下正则的思路,然后我试试在其他编辑器写出来,对vim尤其是宏这块完全 ...
    8 c8 x0 _) e9 Z$ @8 K) U+ K
    1、正则的思路二楼已经说的很清楚了,这里再补充一点详细信息:% h6 S) K* l7 G( ~

    : _6 @$ C3 G  p; ?: R* I; ^
    6 P- C5 P- ?  `- Z3 k- o) V我只是照这个思路根据你的词典结构具体实现,并采用vim的替换功能,以及宏命令重复运行该替换操作。, m4 M% S# |: H) s- S( s

    % B+ Q7 ^5 |) `9 z* [, x2、你只要:help usr_10即可获得关于本解决方案所需要的Vim基础知识
    3 T" G( j) b- u8 ^4 o% {  F- H- F: t& V+ O% q$ J/ t% |
    3、补充方案一的具体思路:6 j( m7 w2 p! f( m( p
    $2h:定位光标到词条定义中
    - q: _% q( K) K"tyi":将词条复制进寄存器t(寓意title)$ x+ H) m8 u+ J( d
    vit:选中当前位置所在标签所包围的内容6 Z$ T0 a: a. V
    :s/\~/^Rt/g:在上述选区范围内进行搜索替换,将所有的~替换为寄存器t中的title内容(其中^R是指Ctrl+r,并非简单字符)6 P8 t: f7 n& e
    /<d:entry:搜索定位到下一个词条起始位置
    " N- L) \8 P. Y) K最后将上述指令放入寄存器中,并用宏命令@重复执行该寄存器的所有指令。
    / m0 [% t! L* x* d: i2 z
    # n# B, ~: Y) i# M7 g& ]6 T7 L
    ! v: t. @. E3 q) o5 D% a
    ( ]6 j/ j1 J) ]# ~6 p

    2 K  d, N5 L8 O6 t, G2 b* F& j0 ^
    5 v9 T0 z% C4 j, k

    本帖子中包含更多资源

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

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

    [LV.7]常住居民III

    发表于 2018-12-26 08:41:09 | 显示全部楼层
    VimVim 发表于 2018-12-26 06:37
    2 t$ B# S7 j4 t7 L, Q( U1、正则的思路二楼已经说的很清楚了。我只是照这个思路根据你的词典结构具体实现,并采用vim的替换功能, ...
    ) O2 u% s& ?$ a" [  z; a2 E% y4 c/ V( Q
    两个方案的实施视频如附,即使不会用看看也过瘾:/ M( }' _  h, @; M- t' W

    本帖子中包含更多资源

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

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

    [LV.5]常住居民I

    发表于 2018-12-26 10:02:26 | 显示全部楼层
    这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml 库。
    0 w6 A' J4 h/ u' m1 G0 P

    1. 6 f1 ~! W/ ?% g+ S7 t/ w; Z
    2. #!/usr/bin/env python2
      5 C# L- i& m$ l( }3 s1 A
    3. # -*- coding: utf-8 -*-
      ( F5 o3 l  V  A' H$ N
    4. """' ?4 v- o4 |/ p" R" R1 ?
    5. File: replace_tilde_with_title.py
      9 M+ W8 i! }- p% f' H
    6. Author: zzhirong; c* j5 U7 s( m5 |4 E* {1 Y0 ?; u4 @
    7. Email: [email protected]
      : B5 m$ o' L# l: @  r
    8. Description: 替换 span 下的 ~ 为 d:entry 的 d:title 属性+ x  I7 R- _: n$ x
    9. """
      ) w! y7 b+ o9 ]1 I% c$ F5 V$ g6 T
    10.   _5 B7 x& M/ K* _1 |
    11. from lxml import etree" Q+ b% ?( i1 q1 ~9 h

    12. / d& ~& [- ]3 g
    13. s = """<?xml version="1.0" encoding="UTF-8"?>8 w: H  Y. ~! F$ L. l
    14. <d:dictionary xmlns="http://www.w3.org/1999/xml" xmlns:d="http://www.apple.com/DTDs/DictionaryService-1.0.rng">4 G" U! Y2 c% u/ C# s
    15. <d:entry id="_38ja" d:title="xxx">2 O, k3 h2 Y4 Q, L$ J% Q6 Q
    16. <d:index d:value="steal" d:title="steal"/><span class="hw">steal</span><br/>
      $ D1 E$ M" {. i) j
    17. <span class="ex">~ a visit <span class="tag1">(an interview)</span> </span><span class="ex_c">测试<span class="tag1">(测试)</span></span>
      ) `/ ]" h' j* ~) G$ T
    18. <span class="ex">~ a kiss </span><span class="ex_c">测试</span>
      * V( J. @) r( H# T5 @. u
    19. <span class="ex">~ rides on the train </span><span class="ex_c">测试</span>+ b. u8 U' E& _% v3 D( }6 S7 I; h/ L1 {
    20. </d:entry>
      8 G3 w' I: R  o& {% R8 x+ y
    21. </d:dictionary>7 t! `/ F& F; J( B6 J9 ?! h) s
    22. """& X% G4 y7 {, ^& P/ J. N

    23. & P/ H2 J- L) W) p% B- d
    24. xml = etree.XML(s)- }2 q. b6 R+ I- z. L
    25. D_NS = xml.nsmap["d"]
      ) @6 D. ]  l" ~! e1 @+ W) _5 K  U+ F
    26. XML_NS = xml.nsmap[None]
      / Z2 X7 d6 g9 i# w. w

    27. + {4 t( p$ D) i
    28. for entry in xml.xpath("//d:entry", namespaces={"d": xml.nsmap["d"]}):
      ! h' r3 r5 W$ Z) T' d! j
    29.     title = entry.get("{%s}title" % D_NS, "")
      4 I$ u- w+ S' I+ M: \( l# i
    30.     for span in entry.iterfind("./{%s}span" % XML_NS):
      0 A2 p3 J, O2 p" u
    31.         span.text = span.text.replace("~", title)
      & U  g: B" |; a2 V
    32. print(etree.tostring(xml))
      0 y. N2 V9 x2 u% d9 s
    复制代码
    ( ?1 E! P6 a, ^/ k" J/ k" L

    本帖子中包含更多资源

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

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

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:25:34 | 显示全部楼层
    VimVim 发表于 2018-12-26 06:37( n1 P0 D% L4 H, m! Y3 _6 O- }
    1、正则的思路二楼已经说的很清楚了,这里再补充一点详细信息:
    ' z+ G* f3 B; n, W
    好,有时间好好研究下。非常感谢,一下涨了不少知识。
    % c* m- \8 _& n" a" h0 T# n8 \1 W$ l4 f8 l
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:27:15 | 显示全部楼层
    zzhirong 发表于 2018-12-26 10:023 u8 L9 R; ^/ N
    这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml  ...

    $ J! o4 ^9 H+ Z* Y, Q前几天我在一个技术群里问正则的问题,里面一个大佬一直给我推荐xpath,说正则那是人用的东西么。哈哈哈( _) x& J6 ?! ]. L/ }3 P9 b
    找时间一定得研究下这东西,哈哈哈哈。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:27:52 | 显示全部楼层
    zzhirong 发表于 2018-12-26 10:02
    + ?, m% K' w/ z' h- C* N这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml  ...

    ' @' j2 U2 S3 ?5 ?7 x感谢分享代码哈。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:28:31 | 显示全部楼层
    VimVim 发表于 2018-12-26 08:41
    . D( H, `, H, B3 F9 H. a% @% U两个方案的实施视频如附,即使不会用看看也过瘾:
    5 N: [9 W' ^$ a) a% C
    下下来看看
  • TA的每日心情
    无聊
    2022-9-25 21:09
  • 签到天数: 1136 天

    [LV.10]以坛为家III

    发表于 2018-12-26 22:03:28 | 显示全部楼层
    孤影 发表于 2018-12-25 20:11
    9 O; s% A4 g5 n) e& }软件项目文件丢失了,不过你可以通过编辑器把全角的~替换成半角的~
    4 C8 R2 V6 r+ }  g5 u4 l0 d) N
    有试过这方法,但是记得好像又有新的问题出现,我再找时间试试。谢谢。
  • TA的每日心情
    怒
    2025-7-22 06:07
  • 签到天数: 391 天

    [LV.9]以坛为家II

    发表于 2018-12-26 22:34:41 | 显示全部楼层
    jonah_w 发表于 2018-12-25 22:24; @, ]! Q% b) ^$ H0 H0 ?# C7 I
    贪婪匹配就全乱了… title跟~对不上了…
    - t, k4 Q1 G( ?% m6 x9 F2 W1 p
    不贪婪怎么匹配所有的~??要不你查一下~的unicode代码,直接转义匹配,看看会不会出错
  • TA的每日心情
    怒
    2025-7-22 06:07
  • 签到天数: 391 天

    [LV.9]以坛为家II

    发表于 2018-12-26 22:36:12 | 显示全部楼层
    jonah_w 发表于 2018-12-26 18:27  m6 u/ Z4 Q: R, ?" S2 b0 q
    前几天我在一个技术群里问正则的问题,里面一个大佬一直给我推荐xpath,说正则那是人用的东西么。哈哈哈
    6 t; o* X- E* v5 K0 k, b ...
    / S2 l& c$ M2 r0 k  J
    正则还算友好,lisp才不是人用的
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-27 15:03:45 | 显示全部楼层
    leescott 发表于 2018-12-25 20:037 |; i# w4 U; p7 S
    这种情况下,我喜欢用cnbook。' m1 J2 V1 Y4 q) M$ Q7 l* D
    复制原件到新建文本里面,替换\n为空。再把
    $ z. {; \! L. u) R9 d
    我在Sublime编辑器里用正则替换,一共需要替换18万多个地方… 结果直接卡死… 如图。想把正则写在sed命令里,但不知道怎么写。求指教。- x8 |& C, ?/ w! Z: L# `8 o# T
    6 ^* T1 O  K8 S+ x# [" m
    界面操作在量大的时候可用性指数下降… % {% g0 l" X' c* W, `8 }" s

    ' }" o- ?- ]5 L% C+ ~
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-28 18:08:57 | 显示全部楼层
    写出了连编辑器都害怕的正则 % {, p3 ^6 ~! n1 C, X' j. j
    5 C- x+ @4 r; A
    ( n7 e# i  [# s$ R/ H
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 21:36:08 | 显示全部楼层
    孤影 发表于 2018-12-25 19:461 }6 Y! n* P) g0 l; h6 [/ @, k# x. i
    我的软件不行吗?
    / L0 F! t) [& ^* a, u* Q, w9 P
    刚试了下孤影大大的小工具,好像不行,没有替换成功,虽然~没有了。 丢失了~前面的单词。
  • TA的每日心情
    开心
    2026-10-4 03:22
  • 签到天数: 814 天

    [LV.10]以坛为家III

    发表于 2018-12-30 22:09:10 | 显示全部楼层
    jonah_w 发表于 2018-12-30 12:360 {  Q8 m- e" b  _; `
    刚试了下孤影大大的小工具,好像不行,没有替换成功,虽然~没有了。 丢失了~前面的单词。 ...

    , ~' d1 X+ D9 H2 B% {发个测试文件看看
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 22:16:57 | 显示全部楼层
    孤影 发表于 2018-12-30 22:095 T  a6 ?2 Q% ]# B' F
    发个测试文件看看
    + _7 x3 |5 h0 J0 A+ h
    / S! Q1 e+ y5 U2 Y- O0 }9 o

    7 N9 ^% Q( r8 H5 o# [0 J7 l# x7 M2 ~, p. h9 n2 y

    本帖子中包含更多资源

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

    x
  • TA的每日心情
    开心
    2026-10-4 03:22
  • 签到天数: 814 天

    [LV.10]以坛为家III

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

    % F0 F" z0 [  V% G7 i; j老哥你这是什么东西?我的那个程序针对的是mdx源文件
    $ M8 j$ k% `8 ~8 a- n4 E* o词头* m0 t/ F' C& R/ J) {
    。。。。。。。。。。。。。。。。。。。。7 v7 U1 r7 l/ s( B* e6 Q
    </>- |. `" Y" ]! \1 Q8 U& P
    . P, z9 D: {7 E8 r  q2 i  z- C3 G4 u
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 22:31:31 | 显示全部楼层
    孤影 发表于 2018-12-30 22:22
    - @+ r/ s& a; o, ~* K1 C老哥你这是什么东西?我的那个程序针对的是mdx源文件' S/ e& l* k1 F0 V* B. d$ B, |- n' g
    词头9 p& N! i' s: {8 H* ~
    。。。。。。。。。。。。。。。。。。。。

    $ C5 o" q: b. Y% \; {. }
    / v6 W  i" _# ?) D; m, t
    ! e9 z2 Y. i; c. D% u# z: G好吧。这个是Mac词典源文件…
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

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

    GMT+8, 2026-11-6 08:58 , Processed in 0.021649 second(s), 16 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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