【问题标题】:Python Regex Negative Lookahead In Tags标签中的 Python 正则表达式负前瞻
【发布时间】:2015-01-26 19:19:42
【问题描述】:

我正在尝试在 Python 中开发一个否定的前瞻正则表达式来匹配不匹配的 xml 样式标签。我有两个字符串:

1) <TIMESTART>11:00</TIMEXSTART>. </bye> <TIMEX>not in december</TIMEX>
2) <TIMESTART>11:00</TIMEXSTART>. <TIMEX>not in december</TIMEX>

正则表达式应该匹配

</bye> in the first sentence but nothing in the second one

目前我有

re.compile(r'<\s*\/\s*[^>]*>.*?((?:<\s*\/\s*.*?>))')

但它总是匹配第二个结束标签。我尝试了否定的前瞻,但它不起作用,它与第二句中的最后一个结束标记 (TIMEX) 匹配:

re.compile(r'<\s*\/\s*[^>]*>^(?!<\s*\/\s*.*?>).*?((?:<\s*\/\s*.*?>))')

编辑:这效果更好,但它仍然无法捕捉到字符串以如下结尾的情况:

....</tag1> </tag2>

re.compile(r'<\s*\/\s*[^>]*>(?!<\s*\/\s*.*?>).*?((?:<\s*\/\s*.*?>)).*?((?:<\s*[^\/]\s*.*?>))')

【问题讨论】:

  • 为什么你不想匹配 &lt;/TIMEXSTART&gt;unmatched xml style tags 是什么意思?
  • 那是被错误复制的原始字符串的子字符串。现在已更正。
  • 您能解释一下为什么不使用解析器吗? (除了“我没有时间了解它是如何工作的”)
  • 你能纠正这个&lt;TIMESTART&gt;11:00&lt;/TIMEXSTART&gt;吗?

标签: python regex negative-lookahead


【解决方案1】:

从组索引 2 中获取不匹配的标签。

<(\w+\b[^<>]*)>(?:(?!<\/?\1>).)*</\1>|(<[^<>]*>)

DEMO

  • &lt;(\w+\b[^&lt;&gt;]*)&gt;(?:(?!&lt;\/?\1&gt;).)*&lt;/\1&gt; 正则表达式将匹配所有正确关闭的标签。
  • | OR(即从剩余的字符串)
  • (&lt;[^&lt;&gt;]*&gt;) 这将捕获剩余的不匹配标签。

【讨论】:

  • 看起来差不多了。如何调整它以使其仅返回未关闭的标签。在演示中,它匹配大多数结束标签。
【解决方案2】:

使用此模式并检查第二个捕获组

<([^<>]*)>[^<>]*<\/\1>|(<\/[^<>]*>)  

Demo

【讨论】:

    【解决方案3】:

    尝试替换内容,而不是使用匹配。

    import re
    p = re.compile(ur'<([^>]*)(\s[^>]*)?>((?!<\/?\1>).)*<\/\1>')
    test_str = u"<TIMEXSTART>11:00</TIMEXSTART>. </bye> <TIMEX>not in december</TIMEX>\n<TIMEXSTART>11:00</TIMEXSTART>. <TIMEX>not in december</TIMEX>"
    subst = u""
    
    result = re.sub(p, subst, test_str)
    

    查看演示。

    http://regex101.com/r/hQ9xT1/23

    【讨论】:

      猜你喜欢
      • 2018-12-28
      • 2012-04-14
      • 2021-10-11
      • 2011-10-14
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多