Python:正则表达式只找到搜索字符串的一部分

时间:2014-04-26 06:59:42

标签: python regex

content变量包含多行字符串:

content = """
/blog/1:text:Lorem ipsum dolor sit amet, consectetur ### don't need this
<break>
text:Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore
<break>
text:Excepteur sint occaecat cupidatat non proident.

/blog/16:text:Other Lorem ipsum dolor ### SEEKING THIS!!!
<break>
text:Other, really other
<break>
text:Blah blah.
"""

我正在尝试使用 / blog / 16 模式找到所需的匹配项:

re.findall('^(?ism)%s?:(.*?)(\n\n)' % '/blog/16', content)

并希望得到这个

[(u'/blog/16:text:Other Lorem ipsum dolor ### SEEKING THIS!!!
<break>
text:Other, really other
<break>
text:Blah blah.', u'\n\n')]

但结果错误( / blog / 1

[(u'/blog/1:text:Lorem ipsum dolor sit amet, consectetur ### don't need this
<break>
text:Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore
<break>
text:Excepteur sint occaecat cupidatat non proident.', u'\n\n')]

我的错误是什么?

3 个答案:

答案 0 :(得分:2)

完成字符串替换后,您的字符串将如下所示

^(?ism)/blog/16?:(.*?)(\n\n)

此处,?表示匹配前一个模式0或1次。因此,当输入为/blog/1时,它会匹配0次并允许匹配。

您正在寻找的实际RegEx是

import re
print re.findall('(?ims)(/blog/16:.*)(?:/blog|$)', content)

<强>输出

['/blog/16:text:Other Lorem ipsum dolor ### SEEKING THIS!!!\n<break>\ntext:Other, really other\n<break>\ntext:Blah blah.\n']

答案 1 :(得分:2)

插入博客文本后,这部分是正则表达式:

/blog/16?:

表示“匹配:/blog/1字面意思;然后6字面意思(零或一次);然后:字面意思”。相反,尝试:

(?ism)^/blog/16:(.*?)$

这会在行的开头逐字地查找所有/blog/16:,然后进行非贪婪搜索直到行尾的任何字符(即捕获行上文本的其余部分)。

您可能会发现regex101对于开发和测试正则表达式很有用。

答案 2 :(得分:2)

我想你忘了把非捕获组放在括号中。 ?:?。现在,你的{{1}}说“前一个元素的0或1”,这意味着6是不必要的。