掌上百科 - 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! r- s' I2 V& w% W1 G4 b+ c/ l
    给你两个解决方案,均已测试通过!

    + J8 n" z7 {% a1 j& m; q4 _. Z因为图片和文档里说的要复制的内容好像不一致,两个都试了下:
    ! E2 G( n2 @( `6 d& L1 O/ y第一种方案先通过 :let @a = '$2h"tyi"vit:s/\~^Rt/g^M/<d:entry^M':
    # K2 u7 R; J1 I4 n复制进寄存器a 回车报错:invalid expression '$2h"tyi"vit:s/\~^Rt/g^M/<d:entry^M'; r; F: F/ ^, Z+ @# x) K0 u+ h
    换成let @a = '$2h"tyi"vit:s/\~/t/g /<d:entry' 没有报错。然后继续运行4@a,结果报错no range allowed$2h"tyi"vit:s/\~/t/g /<d:entry
    ! T; k( i4 [% _" w  A, Z7 h* X; Y4 Z3 C2 w$ Z6 N" K2 S  R1 j
    第二种方案,同样输入:let @b = "vatgJn" 没报错。& J. D5 p; c4 a1 T- V
    再执行4@b 报错 Not an editor command: vatgJn
    / k* F* ^0 J7 [" I- s2 t; r: c! q9 ]: F) Q  X+ ?
    不知道是不是我操作的问题。- b  d5 y& }" I0 i" D
    对了,我在Mac电脑上操作的。用的MacVim软件
    4 O) C" H% j3 }4 t; v7 i
    2 h! k7 M) D% ?! W( D* ]6 k
  • 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
    ' k+ }( k0 v( m' C7 O# W正则应该是可以做的,多用几个子单元应该就可以,从第一行的title关键字后取出单词,在/d之前的字段全部贪 ...

    9 W3 q1 ]) e& x+ O/ {: D! O7 D3 I- s贪婪匹配就全乱了… title跟~对不上了…
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    发表于 2018-12-25 22:56:24 | 显示全部楼层
    本帖最后由 VimVim 于 2018-12-25 23:04 编辑 / X* q  A# r  C6 H
    jonah_w 发表于 2018-12-25 21:507 L- }$ M& Z& J, U1 C' u2 A/ r
    因为图片和文档里说的要复制的内容好像不一致,两个都试了下:
    : o3 a. ~! e* A3 g7 M- |6 j第一种方案先通过 :let @a = '$2h"tyi"vit ...

    0 f0 V  b1 Y1 q4 ~之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看到截图中的^R并不是常规的字符,而是在宏命令中的Ctrl+R
    5 p; M' ^' U% H1 p% `
    7 S; y4 y. y6 j5 f* \( Q3 |同时看你的截图跟我的截图不同,上述特殊字符在你的截图中看不见,可能是mac或vimrc配置的编码不同造成,你自己用qa录制出符合你系统的特殊字符,然后用"ap粘贴出来这些特殊字符,照我的截图补全即可。
    # l$ \. @/ k  b8 m, `% f( `) g6 k% p. B' e2 T: F! e$ }; E% Q
    你只能通过yank命令来实现准确复制特殊字符,不要用let之类,如下两个步骤可实现复制:6 B1 v9 t, P* `. ~7 ~6 _" H
    1、先把光标移到第一个字符
    & c3 f/ l$ E5 P# W; [2、"ay$) a% v( D3 W2 W

    $ l2 ?) R6 u+ n' F6 e3 v无论如何,这是我觉得众多方法中最简洁的,而且不破坏原词典文件的排版格式。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 00:04:31 | 显示全部楼层
    VimVim 发表于 2018-12-25 22:56: |8 |6 F# e* S4 M$ `; q, D
    之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看 ...

    4 ~/ C. B7 i( l. t  \8 X* y1 `是正则的宏处理吗? 可不可以直接说下正则的思路,然后我试试在其他编辑器写出来,对vim尤其是宏这块完全陌生… 不知从何入手
    5 M, v0 D  }) ~3 i+ l( i& ]/ J' L# n5 q
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 00:18:13 | 显示全部楼层
    VimVim 发表于 2018-12-25 22:568 J. r9 c" B, \, z4 Y1 P
    之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看 ...
    1 Q) l8 F1 S6 N) P: T, v4 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; Z: z, e, ?$ M) _& \8 x* @
    给你两个解决方案,均已测试通过!
    9 q7 j3 P, T7 `/ j" j8 d: `
    是在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 编辑 / g% P7 _4 Q- {/ ]) o
    4 ?, z0 M5 _4 Y, o6 t( x
    1. (?<=<d:entry)([\s\S]*?title=")([^"]+)([\w\W]*)(~)([\s\S]*?)(?=</d:entry)
    复制代码
    7 p) x, h1 o9 M! S" ~) D
    换成
    1. \1\2\3\2\5
    复制代码

    * f) I. t+ n1 l5 ^( Shttps://regex101.com/r/iWAJTc/1/
    , G4 M7 I$ N+ j: G3 v  t( Z% F- @" W$ }; y
    我也凑个热闹……貌似可以,不过一次只能换掉一个。多个 ~ 就要点击多次。
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    发表于 2018-12-26 06:37:07 | 显示全部楼层
    本帖最后由 VimVim 于 2018-12-26 11:59 编辑 0 r$ n1 K) X, @' a2 T
    jonah_w 发表于 2018-12-26 00:043 g! o8 `2 I/ v- `9 D( ^+ s* X( c- @
    是正则的宏处理吗? 可不可以直接说下正则的思路,然后我试试在其他编辑器写出来,对vim尤其是宏这块完全 ...

    4 g/ }" Y( d! j+ c. v3 E1、正则的思路二楼已经说的很清楚了,这里再补充一点详细信息:7 F4 w3 ]& p1 J/ \; `

    2 O# Y; ^/ @5 L9 `0 x2 n0 w- I8 r$ C4 K* J) d( C5 D2 ^- E, N7 c
    我只是照这个思路根据你的词典结构具体实现,并采用vim的替换功能,以及宏命令重复运行该替换操作。5 Z" y0 a$ F: E7 H

    . c  a6 G- R- X& B) j( H% J8 [- q" ?% R' \2、你只要:help usr_10即可获得关于本解决方案所需要的Vim基础知识3 t! R. s9 l( i; S9 B5 B

    / E* q; T. T4 K8 L) m3、补充方案一的具体思路:. N5 c. `1 \4 ~4 n
    $2h:定位光标到词条定义中
    ' H) A* ^) a5 H; c"tyi":将词条复制进寄存器t(寓意title)
    ' Y$ S& F# E% z* f) |vit:选中当前位置所在标签所包围的内容* X; Q: p6 {8 I: V3 k2 o
    :s/\~/^Rt/g:在上述选区范围内进行搜索替换,将所有的~替换为寄存器t中的title内容(其中^R是指Ctrl+r,并非简单字符)8 @/ W2 z- A- [9 J
    /<d:entry:搜索定位到下一个词条起始位置6 L' l* {9 Y$ Q2 c
    最后将上述指令放入寄存器中,并用宏命令@重复执行该寄存器的所有指令。
    # O3 K- Q; c8 f' S. [
    ' v" L2 [! y; I% i/ m
    * W# J) H0 d1 p6 G3 d% W
    & z' L4 b" J6 F" |3 e- g+ I) }! H& i0 @  [

    3 i. g$ C! ?. F! L/ k6 v/ L; x8 G# d/ @) h  M- h4 V) u

    本帖子中包含更多资源

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

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

    [LV.7]常住居民III

    发表于 2018-12-26 08:41:09 | 显示全部楼层
    VimVim 发表于 2018-12-26 06:37! }8 ^# L2 h4 l3 S9 J, j0 }
    1、正则的思路二楼已经说的很清楚了。我只是照这个思路根据你的词典结构具体实现,并采用vim的替换功能, ...

    ) Q; H' e: r6 ~% A8 t/ G1 k两个方案的实施视频如附,即使不会用看看也过瘾:
    5 s0 i0 [# P# P. u+ I: v' K

    本帖子中包含更多资源

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

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

    [LV.5]常住居民I

    发表于 2018-12-26 10:02:26 | 显示全部楼层
    这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml 库。* d7 b( x; z' E+ x+ m
    1. + v+ ~* g1 ?9 K5 V1 h5 @; m% P
    2. #!/usr/bin/env python2
      ) s& Z1 X% w9 q2 v
    3. # -*- coding: utf-8 -*-
      + K7 t1 Y% e% t. w* D# l, h
    4. """
      " z5 a( H& j2 Q/ _+ v3 N% I
    5. File: replace_tilde_with_title.py
      + B% r: G3 T3 ^: V. K+ d3 n* R
    6. Author: zzhirong
      . K% z" P% L: K) b* Q
    7. Email: [email protected]
      - T2 P; N4 v: L& B
    8. Description: 替换 span 下的 ~ 为 d:entry 的 d:title 属性. Q+ m$ r+ I- F0 m
    9. """
      * y4 m: _7 c. k; t3 x9 V# g! l' }

    10. % L" s2 U2 d& a: l# M0 P9 Z
    11. from lxml import etree6 x3 C& E, x, X0 E2 z% t

    12. 9 }2 k$ G# o/ x! I5 u
    13. s = """<?xml version="1.0" encoding="UTF-8"?>
      ( H0 B# ~# s6 s: B
    14. <d:dictionary xmlns="http://www.w3.org/1999/xml" xmlns:d="http://www.apple.com/DTDs/DictionaryService-1.0.rng">
      # T  r- S4 Y" P. w' o7 T/ F
    15. <d:entry id="_38ja" d:title="xxx"># H1 i$ ~8 ]5 f. p/ `2 A0 g' o6 ^
    16. <d:index d:value="steal" d:title="steal"/><span class="hw">steal</span><br/>) ~$ j" `) r' A' {- {2 Y6 Y
    17. <span class="ex">~ a visit <span class="tag1">(an interview)</span> </span><span class="ex_c">测试<span class="tag1">(测试)</span></span>
      5 M/ y& d. _: I# X) y6 d
    18. <span class="ex">~ a kiss </span><span class="ex_c">测试</span>
      , v) B& _: j8 V/ d% F
    19. <span class="ex">~ rides on the train </span><span class="ex_c">测试</span>
      : q$ w9 V; n0 \! f: v. j3 ^
    20. </d:entry>
      5 Q9 o; W6 c6 c$ @
    21. </d:dictionary>4 _# M& G. f& d# T% P, R! Y' b& X
    22. """
      : R$ I" l6 {5 n3 \& s( Y( O

    23. 6 Z* L  ~! g9 J2 n
    24. xml = etree.XML(s)! b* [5 n7 h5 X3 c
    25. D_NS = xml.nsmap["d"]
      ) M8 G3 i$ ~, T+ z9 t5 N" R9 H
    26. XML_NS = xml.nsmap[None]( s) @/ e/ D8 x. d
    27. 4 T" G' E1 D# @+ ?9 ]
    28. for entry in xml.xpath("//d:entry", namespaces={"d": xml.nsmap["d"]}):
      6 t  x) F; \& z9 t3 q
    29.     title = entry.get("{%s}title" % D_NS, "")& c$ u8 P- v! P+ d# I$ e5 K8 A
    30.     for span in entry.iterfind("./{%s}span" % XML_NS):
      - T# o# ?5 y! z" \, P3 ?1 q: Q2 g
    31.         span.text = span.text.replace("~", title)
      ) ?& Q2 j. F  o$ G; L
    32. print(etree.tostring(xml))! y8 E4 Z& X. ?) f
    复制代码
    : T5 Z: Y- E# T$ D2 ~% K& z

    本帖子中包含更多资源

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

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

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:25:34 | 显示全部楼层
    VimVim 发表于 2018-12-26 06:378 x, o, {5 J8 u/ K8 }4 l4 D9 W
    1、正则的思路二楼已经说的很清楚了,这里再补充一点详细信息:
    $ b( G8 h* n1 _' j0 _
    好,有时间好好研究下。非常感谢,一下涨了不少知识。
    3 Q/ h6 ~/ F$ S( e7 d( }' e2 E% x8 h# ^
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:27:15 | 显示全部楼层
    zzhirong 发表于 2018-12-26 10:021 y) w9 f) u8 ~. u' [
    这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml  ...

    : v2 x% k( L$ E  q前几天我在一个技术群里问正则的问题,里面一个大佬一直给我推荐xpath,说正则那是人用的东西么。哈哈哈
    + }3 Q* e  _/ u1 N) M! ]) n找时间一定得研究下这东西,哈哈哈哈。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:27:52 | 显示全部楼层
    zzhirong 发表于 2018-12-26 10:02$ O( x. d0 j& Y6 D5 e: m- s
    这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml  ...

    ) d  V4 Y) Y) B' m& T* g感谢分享代码哈。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:28:31 | 显示全部楼层
    VimVim 发表于 2018-12-26 08:41( ?, E) D/ W" h
    两个方案的实施视频如附,即使不会用看看也过瘾:
    ) A1 p( F* j; X8 K( t: T) ]
    下下来看看
  • TA的每日心情
    无聊
    2022-9-25 21:09
  • 签到天数: 1136 天

    [LV.10]以坛为家III

    发表于 2018-12-26 22:03:28 | 显示全部楼层
    孤影 发表于 2018-12-25 20:115 ~: e2 O" I* I) k
    软件项目文件丢失了,不过你可以通过编辑器把全角的~替换成半角的~

      l  o: u0 I7 h7 u有试过这方法,但是记得好像又有新的问题出现,我再找时间试试。谢谢。
  • TA的每日心情

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

    [LV.9]以坛为家II

    发表于 2018-12-26 22:34:41 | 显示全部楼层
    jonah_w 发表于 2018-12-25 22:24
    7 n* C: N! \% R贪婪匹配就全乱了… title跟~对不上了…
    ; k# ]4 a# [9 e4 A, F" `
    不贪婪怎么匹配所有的~??要不你查一下~的unicode代码,直接转义匹配,看看会不会出错
  • TA的每日心情

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

    [LV.9]以坛为家II

    发表于 2018-12-26 22:36:12 | 显示全部楼层
    jonah_w 发表于 2018-12-26 18:27
    # o% j7 y; a" v& H" }) j) y- ^前几天我在一个技术群里问正则的问题,里面一个大佬一直给我推荐xpath,说正则那是人用的东西么。哈哈哈
    4 K; s2 l0 H3 s0 k2 Y# a4 E* ^" Q ...
    # ?( @/ \4 q$ r
    正则还算友好,lisp才不是人用的
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-27 15:03:45 | 显示全部楼层
    leescott 发表于 2018-12-25 20:034 `- R* b9 a% [9 \: \9 m! x
    这种情况下,我喜欢用cnbook。# J( @4 ]) O3 w. [) |
    复制原件到新建文本里面,替换\n为空。再把
    & D% W, g7 U7 s5 C4 X
    我在Sublime编辑器里用正则替换,一共需要替换18万多个地方… 结果直接卡死… 如图。想把正则写在sed命令里,但不知道怎么写。求指教。, _+ t2 Y4 a, |# L; I5 p9 k
    2 F1 [7 K$ i$ W  C
    界面操作在量大的时候可用性指数下降… , `) O  H) A7 P2 i0 [: I

    1 C* G; C; E, W  H. [
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-28 18:08:57 | 显示全部楼层
    写出了连编辑器都害怕的正则 / W( z* Z2 f; ?0 g" `$ p" u. S. _% c
    ! z6 [$ ^  q$ d1 e5 S$ M) T
    * @' y- r) @9 _6 L
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 21:36:08 | 显示全部楼层
    孤影 发表于 2018-12-25 19:46
    % ?. Y9 f( g: I& @. O  T' B我的软件不行吗?
    7 h( Y8 p/ w$ P5 F  ~
    刚试了下孤影大大的小工具,好像不行,没有替换成功,虽然~没有了。 丢失了~前面的单词。
  • TA的每日心情
    开心
    2025-1-7 17:15
  • 签到天数: 773 天

    [LV.10]以坛为家III

    发表于 2018-12-30 22:09:10 | 显示全部楼层
    jonah_w 发表于 2018-12-30 12:36
    + b. Y6 A+ w% \: O3 Z' H刚试了下孤影大大的小工具,好像不行,没有替换成功,虽然~没有了。 丢失了~前面的单词。 ...
    # r  Z. Y3 _% w# S( z
    发个测试文件看看
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 22:16:57 | 显示全部楼层
    孤影 发表于 2018-12-30 22:09
    . w3 M$ s1 _& b发个测试文件看看

    : M' n# y$ U/ K1 j) U; [' u
    , Y# t) L5 ?: K4 i  d$ V+ \3 l/ r: F4 e0 y, x; \

    1 }3 S$ i) k/ p1 F; W. n+ B

    本帖子中包含更多资源

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

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

    [LV.10]以坛为家III

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

      ]( D6 P1 N' p4 _老哥你这是什么东西?我的那个程序针对的是mdx源文件
    7 @# o3 h: W! H9 M1 R6 T" ^词头
    - z! t; s& A8 w7 f& }% W+ z3 V。。。。。。。。。。。。。。。。。。。。9 O4 K1 H$ I( e4 L9 r2 |( o
    </>
    0 T$ D7 \3 c/ b6 Z4 A4 s; h3 J# c/ A
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 22:31:31 | 显示全部楼层
    孤影 发表于 2018-12-30 22:22
    % w6 f* S7 ]/ I) `+ q9 J7 ~& d1 m# b老哥你这是什么东西?我的那个程序针对的是mdx源文件
    . X% k. q% L  u8 ]0 x词头
    ; ^4 E: o- @$ v+ y  [5 y: K6 H。。。。。。。。。。。。。。。。。。。。

    8 c: o. G3 ~, t9 x7 A& H3 G, E7 Y2 d+ ?; U, Y# }2 N

    7 A2 x1 Y1 J, ^& `2 c+ Z/ j7 o( B好吧。这个是Mac词典源文件…
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

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

    GMT+8, 2025-7-10 10:26 , Processed in 0.023993 second(s), 16 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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