正则表达式+ Python:如何用'?'查找字符串在里面?

时间:2014-03-10 17:45:38

标签: python regex

我在content变量中有一个多行字符串,我需要检索包含问号的模式uri的所有匹配项。

这是我到目前为止所做的:

content = """
/blog:text:Lorem ipsum dolor sit amet, consectetur adipisicing elit
<break>
text:Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore
<break>
text:Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia.

/blog?page=1:text:Lorem ipsum dolor sit amet, consectetur adipisicing elit
<break>
text:Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore
<break>
text:Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia.
"""

#uri = '/blog' # Works fine
uri = '/blog?page=1'
re.findall('^(?ism)%s?:(.*?)(\n\n)' % uri, content)

uri获取带有参数的?后,它才能正常运行,我会得到空列表。

如何修复正则表达式的任何想法?

3 个答案:

答案 0 :(得分:1)

Python的re.escape()是你的朋友。如果你不使用它,那么uri中的?将在正则表达式中使用它的通常含义(使前一项与0或1匹配)。

uri = '/blog?page=1'
re.findall('^(?ism)%s?:(.*?)(\n\n)' % re.escape(uri), content)

我不清楚?:%s之后你想要的{{1}}究竟是什么,所以我将它留在可能错误的假设中,因为它是有原因的。 / p>

答案 1 :(得分:1)

我会保持简单并找到可能的匹配项,然后筛选出包含?的匹配项,例如:

import re

candidates = (m.group(1) for m in re.finditer('^(.*?):', content, flags=re.M))
matches = [m for m in candidates if '?' in m]
# ['/blog?page=1']

答案 2 :(得分:0)

我在content中没有看到两个换行符。另外,我从uri中逃脱了?,因为它是正则表达式字符。

uri = '/blog\?page=1'
re.findall('^(?ism)%s?:(.*?)[\n\r]' % uri, content)