标签中的Python正则表达式否定前瞻

时间:2014-11-28 06:55:07

标签: python regex negative-lookahead

我试图在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*.*?>))')

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

Demo

答案 2 :(得分:0)

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

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

DEMO

  • <(\w+\b[^<>]*)>(?:(?!<\/?\1>).)*</\1>正则表达式会匹配所有正确关闭的标记。
  • | OR(即来自其余字符串)
  • (<[^<>]*>)这会捕获剩余的不匹配标记。