Regex否定的Lookahead没有按预期工作

2024-10-01 04:47:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图捕捉两个最接近的短语之间的文本,包括那些短语,但是消极的前瞻在我的情况下似乎不起作用。你知道吗

这是文本文件的一部分:

<in><il>plural</il> <if>aba*cus*es</if> <il>also</il> <if>aba*ci</if> <sound><wav>abaci001.wav</wav><wav>abaci002.wav</wav></sound> <pr>-ˌsaɪ</pr> <altpr>ˈæbəˌsaɪ</altpr></in>
<in><il>plural</il> <if>fau*nas</if> <il>also</il> <if>fau*nae</if> <sound><wav>fauna002.wav</wav></sound> <pr>ˈfɑ:ˌni:</pr></in>
<il>or</il> <if>fur*ther</if> <sound><wav>far00003.wav</wav></sound> <in><if>far*thest</if> <sound><wav>farthe03.wav</wav></sound>

我需要捕获每一对<if>...</if><wav>...</wav>标记。你知道吗

我的正则表达式是:<if>.*?<\/if>(?:(?!<if>.*?<\/if>).)*?<wav>.*?<\/wav>

Regex101示例:https://regex101.com/r/eT4wJ9/1

出于某种原因,如果有两个或两个以上的<if>...</if>标记出现,那么这个正则表达式将匹配从第一个出现开始的所有内容,尽管前面是负数。为什么会这样?你知道吗


Tags: in标记文本ifsaprilalso
1条回答
网友
1楼 · 发布于 2024-10-01 04:47:40

您还需要在if块中添加一个负的lookahead,这样它就不会匹配嵌套的if标记。你知道吗

<if>(?:(?!</?if>).)*<\/if>(?:(?!<if>.*?<\/if>).)*?<wav>(?:(?!</?wav>).)*<\/wav>

DEMO

示例:

>>> s = '''<in><il>plural</il> <if>aba*cus*es</if> <il>also</il> <if>aba*ci</if> <sound><wav>abaci001.wav</wav><wav>abaci002.wav</wav></sound> <pr>-ˌsaɪ</pr> <altpr>ˈæbəˌsaɪ</altpr></in>
<in><il>plural</il> <if>fau*nas</if> <il>also</il> <if>fau*nae</if> <sound><wav>fauna002.wav</wav></sound> <pr>ˈfɑ:ˌni:</pr></in>
<il>or</il> <if>fur*ther</if> <sound><wav>far00003.wav</wav></sound> <in><if>far*thest</if> <sound><wav>farthe03.wav</wav></sound>'''
>>> for i in re.findall(r'<if>(?:(?!</?if>).)*<\/if>(?:(?!<if>.*?<\/if>).)*?<wav>(?:(?!</?wav>).)*<\/wav>', s):
        print(i)


<if>aba*ci</if> <sound><wav>abaci001.wav</wav>
<if>fau*nae</if> <sound><wav>fauna002.wav</wav>
<if>fur*ther</if> <sound><wav>far00003.wav</wav>
<if>far*thest</if> <sound><wav>farthe03.wav</wav>

相关问题 更多 >