掌上百科 - 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* ^# X6 x) B: F" y# X
    给你两个解决方案,均已测试通过!

    5 T& q( h# {8 q- f" w+ c因为图片和文档里说的要复制的内容好像不一致,两个都试了下:9 ^) L6 }8 V9 c1 X7 `2 ~2 j
    第一种方案先通过 :let @a = '$2h"tyi"vit:s/\~^Rt/g^M/<d:entry^M':
    ' m  G/ E' {+ ^9 q9 u9 z& T复制进寄存器a 回车报错:invalid expression '$2h"tyi"vit:s/\~^Rt/g^M/<d:entry^M'
    ; F) t% w4 b: E6 R换成let @a = '$2h"tyi"vit:s/\~/t/g /<d:entry' 没有报错。然后继续运行4@a,结果报错no range allowed$2h"tyi"vit:s/\~/t/g /<d:entry
    . K3 z6 ?' s# r1 {* M# K4 B3 s4 S* s! ]
    第二种方案,同样输入:let @b = "vatgJn" 没报错。/ P7 R5 x# j' W# n  \2 [' Z7 p
    再执行4@b 报错 Not an editor command: vatgJn
    % N/ @; H5 A* [- c
    ( c- D. w  a4 C, I/ h( Q1 a! n1 V" ]不知道是不是我操作的问题。
    ! y3 m1 Q9 n% Z# e* ?% f4 f对了,我在Mac电脑上操作的。用的MacVim软件
    - w1 K5 T% o1 `+ E, {9 k8 l9 S: \
      Y$ p. e( {5 \
  • 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+ B0 O6 o, e# m" \5 |) W/ }
    正则应该是可以做的,多用几个子单元应该就可以,从第一行的title关键字后取出单词,在/d之前的字段全部贪 ...

    ; ?0 t; P1 p9 `( n: z! W- K( _贪婪匹配就全乱了… title跟~对不上了…
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    发表于 2018-12-25 22:56:24 | 显示全部楼层
    本帖最后由 VimVim 于 2018-12-25 23:04 编辑
    " a) F8 Q5 `  K8 {* `
    jonah_w 发表于 2018-12-25 21:50
    ! b4 t4 s) E. L1 c" K& x2 b因为图片和文档里说的要复制的内容好像不一致,两个都试了下:
    8 v: I! l. N# h& Q; l第一种方案先通过 :let @a = '$2h"tyi"vit ...

    3 H( }4 G; D9 W+ i' v( j; h( d. V之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看到截图中的^R并不是常规的字符,而是在宏命令中的Ctrl+R- }: c; I/ E/ v$ B: b* {# \
    " Y. E' Z" z- r7 S% w8 u
    同时看你的截图跟我的截图不同,上述特殊字符在你的截图中看不见,可能是mac或vimrc配置的编码不同造成,你自己用qa录制出符合你系统的特殊字符,然后用"ap粘贴出来这些特殊字符,照我的截图补全即可。
    ! v+ _; ~+ A! f1 B$ ?9 L3 \
    / @# J! k; r' M; S你只能通过yank命令来实现准确复制特殊字符,不要用let之类,如下两个步骤可实现复制:
    4 j1 D2 ^3 X# j1、先把光标移到第一个字符
    " J6 o/ U* [6 \2、"ay$3 u- c, l& J( C( I
    ( ~4 r# H' E' f: Q
    无论如何,这是我觉得众多方法中最简洁的,而且不破坏原词典文件的排版格式。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 00:04:31 | 显示全部楼层
    VimVim 发表于 2018-12-25 22:56
    3 w# ]3 }7 g) j/ Z4 a之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看 ...
    7 T, C' r/ w) M1 f4 o; _4 a
    是正则的宏处理吗? 可不可以直接说下正则的思路,然后我试试在其他编辑器写出来,对vim尤其是宏这块完全陌生… 不知从何入手- L0 t& h' n- b9 S0 M, |) J$ a1 L

    8 p7 F, i8 A0 u/ w: R* g
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 00:18:13 | 显示全部楼层
    VimVim 发表于 2018-12-25 22:56
    ) u. c$ K* f7 I  M1 V& Z' ^之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看 ...

    ' B! r+ q$ C5 E! F/ s另外 按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
    & y& @7 m  B+ W! L% d. H. }7 x/ j给你两个解决方案,均已测试通过!

    - l" y4 D3 v* ^5 l& 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 编辑 % e% n5 u8 C: a) z' v; T5 G
    / ?7 `4 y5 |. Z) P$ J& v7 Y( Y  o
    1. (?<=<d:entry)([\s\S]*?title=")([^"]+)([\w\W]*)(~)([\s\S]*?)(?=</d:entry)
    复制代码
    $ o5 F( n9 K4 I
    换成
    1. \1\2\3\2\5
    复制代码

    " o* T9 i: p. Z1 u. ]https://regex101.com/r/iWAJTc/1/  g6 [9 d6 \8 \" T8 ?6 g( \9 b

    2 d9 m% g, B$ [我也凑个热闹……貌似可以,不过一次只能换掉一个。多个 ~ 就要点击多次。
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    发表于 2018-12-26 06:37:07 | 显示全部楼层
    本帖最后由 VimVim 于 2018-12-26 11:59 编辑 " e& D# O# Z' f: A) g) z: v
    jonah_w 发表于 2018-12-26 00:046 a) _* e8 u) k% W' c( g
    是正则的宏处理吗? 可不可以直接说下正则的思路,然后我试试在其他编辑器写出来,对vim尤其是宏这块完全 ...

    3 m, B1 t8 q8 @: I0 q1、正则的思路二楼已经说的很清楚了,这里再补充一点详细信息:3 ^. i- i2 \" o- l0 n7 s/ F
    & M& Y/ L  T, e+ K4 I
    0 r7 O* H1 L9 l- z
    我只是照这个思路根据你的词典结构具体实现,并采用vim的替换功能,以及宏命令重复运行该替换操作。
    " V/ I* o' V" L
    4 @; |. a7 S; ?; b. A2、你只要:help usr_10即可获得关于本解决方案所需要的Vim基础知识1 F# K3 {# S, R4 D. g7 b
    / v8 C! ]8 w2 g8 k8 Q2 E
    3、补充方案一的具体思路:
    ) }4 X( x0 I( _# g; d8 Q+ O$2h:定位光标到词条定义中
    0 H6 F$ \9 A5 t9 l4 H"tyi":将词条复制进寄存器t(寓意title)+ a1 q9 p/ H* w3 j/ i; \& w
    vit:选中当前位置所在标签所包围的内容
    3 b3 v8 h, y5 H3 m:s/\~/^Rt/g:在上述选区范围内进行搜索替换,将所有的~替换为寄存器t中的title内容(其中^R是指Ctrl+r,并非简单字符)
    ; l% T! R* c( g* w4 d" F/<d:entry:搜索定位到下一个词条起始位置
    1 Y- s5 W) Z7 P% L0 O3 `# v最后将上述指令放入寄存器中,并用宏命令@重复执行该寄存器的所有指令。2 f; F* \- ]: i
    7 @  r9 P5 L- S. ~+ u

    & r' S; t6 R/ `  f; n1 p3 A$ H8 Q8 @2 Q4 m& Z
    7 B5 C. ~& `2 _  b  T( C0 T

    9 d0 a& t% Z7 n9 C: w# v" D0 Y* a# d

    本帖子中包含更多资源

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

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

    [LV.7]常住居民III

    发表于 2018-12-26 08:41:09 | 显示全部楼层
    VimVim 发表于 2018-12-26 06:37
      g& E. }" J$ `4 q1 m+ r$ d! N1、正则的思路二楼已经说的很清楚了。我只是照这个思路根据你的词典结构具体实现,并采用vim的替换功能, ...
    / A% o3 {  Z7 a
    两个方案的实施视频如附,即使不会用看看也过瘾:
    - M, N% p) o, R( U* l' ^) o

    本帖子中包含更多资源

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

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

    [LV.5]常住居民I

    发表于 2018-12-26 10:02:26 | 显示全部楼层
    这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml 库。
    " l6 J3 @& k- \* b( d" w3 H
    1.   D1 d7 f! A$ p9 d
    2. #!/usr/bin/env python2/ j! ^$ {2 C" I: D8 W8 X
    3. # -*- coding: utf-8 -*-
      4 T" b1 H# g0 r- G& M
    4. """, e) `0 K$ h- }; I( G8 n
    5. File: replace_tilde_with_title.py, ~3 I3 I5 T# N; l: v
    6. Author: zzhirong9 s  y" @+ G: p  j
    7. Email: [email protected]# I  h. N- ?5 ^! J- O) m6 l
    8. Description: 替换 span 下的 ~ 为 d:entry 的 d:title 属性
      % `/ y6 }* ^. O0 C; y4 H
    9. """
      0 N* }1 S5 y% A% n4 e0 E

    10. " g1 T1 T4 y$ J6 j/ k" b% Q9 P' i
    11. from lxml import etree
      ) h0 i, M& |5 y5 C/ n1 Q* X, k' }

    12. 7 }, I9 C& B% D; S; i) q
    13. s = """<?xml version="1.0" encoding="UTF-8"?>1 K6 Y& T- a2 h- a( H8 Q% r2 m
    14. <d:dictionary xmlns="http://www.w3.org/1999/xml" xmlns:d="http://www.apple.com/DTDs/DictionaryService-1.0.rng">6 i' m- a$ v: H; M8 v0 M' @; C
    15. <d:entry id="_38ja" d:title="xxx">
      - L* }/ ~1 a" O$ v
    16. <d:index d:value="steal" d:title="steal"/><span class="hw">steal</span><br/>
      " \( A  V2 R  E- `0 i
    17. <span class="ex">~ a visit <span class="tag1">(an interview)</span> </span><span class="ex_c">测试<span class="tag1">(测试)</span></span>& {6 k0 N2 {6 L; ~
    18. <span class="ex">~ a kiss </span><span class="ex_c">测试</span>1 {+ l  J3 H  N  y3 m+ k; K) K  S
    19. <span class="ex">~ rides on the train </span><span class="ex_c">测试</span>: h. b1 x8 }. Z/ T4 x& q
    20. </d:entry>
      6 y$ g) C2 l' x
    21. </d:dictionary>
      1 x3 A  g- E' W  I3 p9 L3 H
    22. """
      " X4 A) W% {# I* D- K
    23. % u. Q; F% c- L; ~1 M* v
    24. xml = etree.XML(s)  J- C* b* s# _, O
    25. D_NS = xml.nsmap["d"]
      * k0 W6 I" N% T# e: m
    26. XML_NS = xml.nsmap[None]
      $ v2 j* _6 p$ k( ]8 X' M: f4 s
    27.   Z1 _6 ^3 d  V6 h4 x8 ^  i2 |3 A
    28. for entry in xml.xpath("//d:entry", namespaces={"d": xml.nsmap["d"]}):. a# A% X, _' o! }* d0 w( J
    29.     title = entry.get("{%s}title" % D_NS, "")
      / m0 r. _5 f# j# `' ?. f  n
    30.     for span in entry.iterfind("./{%s}span" % XML_NS):
      & p0 P4 s8 J9 f0 e. J" l1 o3 G8 H: _5 ^
    31.         span.text = span.text.replace("~", title)! J3 S- b! @3 L7 m
    32. print(etree.tostring(xml))
      8 m' Y! x2 J- H$ H# S4 d1 p  q
    复制代码
    % Q5 @+ A+ \! B- u. M- w

    本帖子中包含更多资源

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

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

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:25:34 | 显示全部楼层
    VimVim 发表于 2018-12-26 06:37
    6 x/ i' j7 T5 T0 V9 ^0 F$ N8 w4 L5 z1、正则的思路二楼已经说的很清楚了,这里再补充一点详细信息:

    : i. w" W0 [1 w/ A7 K( f好,有时间好好研究下。非常感谢,一下涨了不少知识。
    ( a$ J9 j  Y* ^
    , s) ]! i* u0 d# |. f
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:27:15 | 显示全部楼层
    zzhirong 发表于 2018-12-26 10:025 r4 P3 P* J" N% E4 W5 i
    这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml  ...
    & ], ?, H% I( W5 B4 x9 \9 F- m! e
    前几天我在一个技术群里问正则的问题,里面一个大佬一直给我推荐xpath,说正则那是人用的东西么。哈哈哈, \# S" @+ v- M
    找时间一定得研究下这东西,哈哈哈哈。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:27:52 | 显示全部楼层
    zzhirong 发表于 2018-12-26 10:02! i# W, j' @/ r' [9 b- k
    这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml  ...

    9 T& U% c, @  y  o. {& g0 l* [6 ?/ z2 E感谢分享代码哈。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:28:31 | 显示全部楼层
    VimVim 发表于 2018-12-26 08:41+ ]2 ]7 O: H3 a; _9 `- x& w3 c, _3 u
    两个方案的实施视频如附,即使不会用看看也过瘾:
    . r6 Z' y+ Q& J4 k6 ?: P0 e
    下下来看看
  • TA的每日心情
    无聊
    2022-9-25 21:09
  • 签到天数: 1136 天

    [LV.10]以坛为家III

    发表于 2018-12-26 22:03:28 | 显示全部楼层
    孤影 发表于 2018-12-25 20:11
    # n* q7 h& d2 U/ _6 Z& e软件项目文件丢失了,不过你可以通过编辑器把全角的~替换成半角的~
    6 ~7 x( \. _" e7 x
    有试过这方法,但是记得好像又有新的问题出现,我再找时间试试。谢谢。
  • TA的每日心情

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

    [LV.9]以坛为家II

    发表于 2018-12-26 22:34:41 | 显示全部楼层
    jonah_w 发表于 2018-12-25 22:24$ ^1 N  ^( j) e% [, t9 U& \
    贪婪匹配就全乱了… title跟~对不上了…
    8 z- a$ d1 z2 B* U9 _1 }
    不贪婪怎么匹配所有的~??要不你查一下~的unicode代码,直接转义匹配,看看会不会出错
  • TA的每日心情

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

    [LV.9]以坛为家II

    发表于 2018-12-26 22:36:12 | 显示全部楼层
    jonah_w 发表于 2018-12-26 18:27
    ; L9 S& c; W# H1 C5 }9 i+ F: {前几天我在一个技术群里问正则的问题,里面一个大佬一直给我推荐xpath,说正则那是人用的东西么。哈哈哈
    6 [  P/ [5 U  J3 ^  g6 [9 A  @8 A ...
    " ~! `0 ]+ H# J$ s, k& t
    正则还算友好,lisp才不是人用的
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-27 15:03:45 | 显示全部楼层
    leescott 发表于 2018-12-25 20:032 i$ t  D, X# o" Y7 C3 d% U! D1 x
    这种情况下,我喜欢用cnbook。
    ! n& O* `" `$ l- z6 T) r复制原件到新建文本里面,替换\n为空。再把

    * Q' e) b/ R" Z$ `7 y6 G8 N; q# I我在Sublime编辑器里用正则替换,一共需要替换18万多个地方… 结果直接卡死… 如图。想把正则写在sed命令里,但不知道怎么写。求指教。- ^5 T/ c8 D8 g

    . W( }' T: J3 t  `& g  ^& s4 g界面操作在量大的时候可用性指数下降…
    & D4 ^- O% X, Z+ L
    : p" N' G: ], B( g4 Q6 A  C
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-28 18:08:57 | 显示全部楼层
    写出了连编辑器都害怕的正则 2 p5 O& b; M; m1 p: z" y8 y

    ' {5 V5 w- S% b3 R& n4 f4 s$ j
    2 d' H3 o/ f9 y
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 21:36:08 | 显示全部楼层
    孤影 发表于 2018-12-25 19:46" l7 ^# H7 Z+ x& _9 Q0 c- g
    我的软件不行吗?
    4 H& o$ R' G, X! B' @
    刚试了下孤影大大的小工具,好像不行,没有替换成功,虽然~没有了。 丢失了~前面的单词。
  • TA的每日心情
    开心
    5 天前
  • 签到天数: 760 天

    [LV.10]以坛为家III

    发表于 2018-12-30 22:09:10 | 显示全部楼层
    jonah_w 发表于 2018-12-30 12:36
    - K, q5 q- Z+ b# E4 |. ]刚试了下孤影大大的小工具,好像不行,没有替换成功,虽然~没有了。 丢失了~前面的单词。 ...
    2 G0 T& g/ C7 O5 _( s5 U7 a
    发个测试文件看看
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 22:16:57 | 显示全部楼层
    孤影 发表于 2018-12-30 22:091 {: T2 z* P3 x! j9 v6 b
    发个测试文件看看
    & ]$ M7 T6 v' \' y, S

    9 `5 r# f. n4 n4 h2 a  m
    8 u5 c; e7 B% g) }
    , K8 u% J0 E* y- i$ p  A

    本帖子中包含更多资源

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

    x
  • TA的每日心情
    开心
    5 天前
  • 签到天数: 760 天

    [LV.10]以坛为家III

    发表于 2018-12-30 22:22:54 | 显示全部楼层
    ; m% E# K3 C1 F5 O$ K# Q
    老哥你这是什么东西?我的那个程序针对的是mdx源文件$ t. R3 w3 R) K1 ~# a6 n0 `+ e
    词头0 {! d9 v5 n8 R% \+ T, ~
    。。。。。。。。。。。。。。。。。。。。
    5 d4 F! r$ L3 y& c$ Q$ y/ [# s" K( h</>
    # L$ q/ h4 o: _$ L
    " p9 O4 S( D/ }0 A% }3 ^% P/ |
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 22:31:31 | 显示全部楼层
    孤影 发表于 2018-12-30 22:22, I+ w" \* M+ z2 Q9 S  t3 f( X* O- Z
    老哥你这是什么东西?我的那个程序针对的是mdx源文件
      a; A1 o( w5 A3 \  S: ]词头
    / h- ?- P! F8 Q( G* k) j" q。。。。。。。。。。。。。。。。。。。。
    7 D8 {& Q3 c5 W- D% h6 ?: t

    0 W/ J" \$ m& |) R) g  ~; ?, }: Q( |: w8 j: x1 X$ `
    好吧。这个是Mac词典源文件…
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

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

    GMT+8, 2024-5-10 17:24 , Processed in 0.085496 second(s), 5 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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