在python

时间:2016-01-06 06:02:13

标签: python python-3.x

我希望将正确的字符串与正则表达式匹配,但我不能。

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

3 个答案:

答案 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)