我希望将正确的字符串与正则表达式匹配,但我不能。
import re
str = "<meta apple <meta" \
"we go<meta" \
"goto mac <meta td yiyang ziyou" \
"net<meta aaask zoie where to go?" \
"<meta " \
"buy mac"
r = re.findall("<meta(?!.*<meta).*mac", str, re.S)
我认为会匹配两个字符串,一个是<meta goto mac
,另一个是<meta buy mac
,但我刚拿到最后一个。为什么?我使用PyCharm 5.0.3,python的版本是3.5.1。谢谢。
答案 0 :(得分:2)
另一个答案说明了为什么你只得到最后一场比赛,并注意输入字符串中没有换行符,你不需要添加re.S
修饰符。 <meta(?!.*<meta)
否定前瞻断言<meta
旁边不存在字符<meta
,因此仅在最后一个字符串中出现。
为了得到结果,你的正则表达式必须是
<meta(?:(?!<meta).)*?mac
示例:的
>>> s = "<meta apple <meta" \
"we go<meta" \
"goto mac <meta td yiyang ziyou" \
"net<meta aaask zoie where to go?" \
"<meta " \
"buy mac"
>>> s
'<meta apple <metawe go<metagoto mac <meta td yiyang ziyounet<meta aaask zoie where to go?<meta buy mac'
>>> re.findall(r'<meta(?:(?!<meta).)*?mac', s)
['<metagoto mac', '<meta buy mac']
答案 1 :(得分:0)
问题是你有一个负向前瞻操作符(?!.*<meta)
,这意味着对于任何匹配,后面的字符串中不必须是<meta
。
因此,只匹配您的上一个<meta
字符串,因为只有它符合此条件。
答案 2 :(得分:0)
正则表达式中的。*耦合是一个有用的,强大的工具,但它也非常危险。你可能想让你的正则表达式更具体一些。有关原因的具体细节已在其他帖子中得到解答。但如果你真的想找到一个解决方案来匹配你在这里寻找的项目,那么它就是正则表达式:
import re
string = "<meta apple <meta" \
"we go<meta" \
"goto mac <meta td yiyang ziyou" \
"net<meta aaask zoie where to go?" \
"<meta " \
"buy mac"
print re.findall('(<meta[\w\s]*mac)',string,re.DOTALL)