当前位置: 首页 > 知识库问答 >
问题:

正则表达式负前瞻不能按预期工作

竺捷
2023-03-14

我试图捕捉两个最接近的短语之间的文本,包括这些短语,但消极的展望似乎在我的情况下不起作用。

因此,这是文本文件的一部分:

<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>

我需要捕捉每一对<代码>

我的正则表达式是:

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

出于某种原因,如果< code >出现了两次或更多次


共有1个答案

谷梁襦宗
2023-03-14

您还需要在if块中添加负前瞻,以便它与嵌套的if标记不匹配。

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

演示

例:

>>> 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>
 类似资料:
  • 我有以下示例文本 当我应用以下正则表达式时,当我打印第一个捕获组时,我期望以下输出 但是我最终得到的是 在我看来,由于某种原因,否定的先行部分被忽略了,因此正则表达式与整个字符串匹配。 真正让我困惑的是,积极的前瞻性正如我所期望的那样工作。例如,使用在打印第一个捕获组时返回以下内容 这是有道理的,所以我真的很困惑为什么消极的前瞻性没有正常运作。

  • 问题内容: 我正在尝试对Elasticsearch查询进行否定前瞻,正则表达式为: 我要匹配的文本是: 归还了住宿费用,但仍存在建筑问题。喷洒化学药品会引起健康问题,并引起眼睛刺激。 我没有任何幸运。有人可以帮忙吗? ES查询: 问题答案: 您可以使用以下两种方法之一来解决此问题: 要么 带可选的(因为 默认情况下 为ON ) 它是如何工作的? 在常见的NFA正则表达式中,通常会有负面的环顾四周,

  • 我目前正在玩正则表达式,试图更好地理解它们,并且有一个我现在似乎正在努力的场景,因为我不知道这是否可以通过正则表达式来实现。 我有这样的文本字符串 该清单可能仍在进行中。我想匹配(选择)内部关键字之间的空格。因此,在第二行中,它将是和之间的空格。 和我能够匹配关键字中包含多个单词的行。将第一部分<代码>( 编辑:假设这些行之间还有一些其他文本,所以简单的< code>\b不能作为正则表达式使用。

  • 问题内容: 我已经努力了两天才能使它正常工作,但我做不到(对正则表达式:S太糟糕了)。 从本文中,我需要检索两个不同的东西:和。为此,我创建了此正则表达式: 在该示例中,它可以工作。但是,如果我尝试其他文本:,则只会得到一个包含2个分组的匹配:和,而不是获得2个不同的匹配:一个具有分组和,另一个具有分组和。 我希望你能帮助我。 提前致谢。 问题答案: 这是为什么组合可能是邪恶的经典示例。请改用否定

  • 问题内容: 琐碎的正则表达式问题(答案很可能是特定于Java的): 这将返回false。据我所知,是指它始终意味着的含义,没有特殊含义,因此我将其翻译为“字符串开头的’#’”。哪个应该匹配。在Perl中也是如此: 打印“ 1”。所以我很确定答案是特定于Java的。有人能启发我吗? 谢谢。 问题答案: 检查 整个输入字符串 是否与正则表达式匹配。 由于您的正则表达式仅与第一个字符匹配,因此它返回。

  • 我已经为名称验证创建了一个正则表达式,其中只允许“_”、“-”、“'”、“.”。 以下是正则表达式: 问题是这是其允许的名称有< code>@,检查小提琴演示: 应为:不应允许包含< code>@的名称。 注意:当我在https://regex101.com/#javascript测试这个正则表达式时,它运行良好