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')]
我的错误是什么?
答案 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是不必要的。