我在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
获取带有参数的?
后,它才能正常运行,我会得到空列表。
如何修复正则表达式的任何想法?
答案 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)