【求助】请教一个关于正则匹配的问题

小伙伴们好!我想请教一下关于正则表达式匹配的问题,希望有伙伴能帮助解决。具体问题见下:

文本数据见下:

<z><i>書?盤庚上</i>:“各恭爾事,齊乃位,度乃口。”</z>
<z><u>孫星衍</u>疏:“度,<i>説文</i>作‘??’,云:‘閉也。’此省文。”</z>
<z><i>墨子?小取</i>:“度其所惡。”</z><z><u>刘师培</u>注:“度與??同,閉也。??其所惡,謂塞其所惡也。”</z>

我想要提取的是在引号“之后出现书名标签< i>(不一定紧接着,引号和书名标签之间可以有其它字符)的< z>标签一行,即提取结果是文本数据第二段「孙星衍疏…」。

所以正则表达式该如何写呢?

感谢你们的帮助和解答:smiley_cat:

如果设定引号“之后与标签<i>中间隔着0到10个字符,可写成
^<z>.*:“.{0,10}?<i>.*</z>$
^表示行首,$表示行尾

不知道对不对,可试试看。
找出不符合要求的或者漏掉的行后,再改进表达式

谢谢解疑。可能我上面解释不够清楚。其实文本数据中< z>标签是不换行的,是合并一起的。如果我只是想匹配符合上述特征的< z>标签之间的内容呢。也就是对每个< z>标签文本进行检索,看其是否符合上述的特征,符合就匹配提取该< z>标签的内容。这又该怎么写呢

那就试试
<z>.*:“.{0,10}?<i>.*?</z>
多了第二个?,建议兄台了解一下正则中贪婪模式的定义

不过这种写法有bug。最好是先处理一下,把每对<z></z>放在单独一行,可以避免bug

哈哈好的,我了解了一点点,正在边解决边学。您这个正则我试了下,特征描写是正确的,不过就是会把所有的< z>标签都含括在内,所以匹配的结果也不是很准确。如何才能精准提取符合这一特征的每一个< z>标签的内容呢,真头大:rofl:

分行好像能解决,但是这字典数据太庞大不太好为每个< z>分行:rofl:

是不会这个吗?<z>替换为\n<z></z>替换为</z>\n
bug是因为上面那个表达式的第一个.*自由度太大,所以需要放在单独一行

慢慢试试看吧,熟能生巧。
我的正则水平也不高,看看其他高手有啥好办法

1 个赞

好的,经您解答有了些思绪,我在摸索摸索,十分感谢!:smile:

<z>((?!<\/z>).|\n|\r)*“((?!”).|\n|\r)*<i>((?!<\/z>).|\n|\r)*<\/z>

<>Regex Tutorial - Lookahead and Lookbehind Zero-Length Assertions<>

1 个赞

感谢!很完美:+1:也感谢提供学习网站,速学了一会,明白了不少 :smile: