我试图在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*.*?>))')
答案 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)
参见演示。
答案 1 :(得分:0)
答案 2 :(得分:0)
从组索引2中获取不匹配的标记。
<(\w+\b[^<>]*)>(?:(?!<\/?\1>).)*</\1>|(<[^<>]*>)
<(\w+\b[^<>]*)>(?:(?!<\/?\1>).)*</\1>
正则表达式会匹配所有正确关闭的标记。|
OR(即来自其余字符串)(<[^<>]*>)
这会捕获剩余的不匹配标记。