我试图在python中找到类似于Ruby函数扫描的功能。我的目标是获取列表中两个花括号之间的所有文本。如果字符串中有多对花括号,我希望列表中有多个条目。
当我运行此代码时:
match = re.search(r'\{(.+)\}', request.params['upsell'])
print match.group()
我匹配正确的文字。但是,捕获的内容包括花括号。我不想包含这个文本,我想包括介于两者之间的所有内容,但不是花括号谢谢!
答案 0 :(得分:11)
使用group(1)
或lookbehinds / aheads。 (另外,请务必接受F.J.和J.F.的建议并使用.+?
或[^{}]*
import re
match = re.search(r'\{(.+)\}', "asdfasd {asdf}asdfasdf")
print match.group(1)
或与lookbehinds / aheads:
import re
match = re.search(r'(?<=\{)(.+)(?=\})', "asdfasd {asdf}asdfasdf")
print match.group()
答案 1 :(得分:9)
re.findall(r'\{(.+?)\}', request.params['upsell'])
这将返回一个列表,其中每个条目都是不同花括号组的内容。请注意,这不适用于嵌套大括号。
?
之后的.+
将使其成为一个懒惰的匹配(而不是贪婪)。这意味着匹配将在第一个“}”处停止,而不是继续匹配尽可能多的字符并以最后一个右括号结束。
re.findall()
将搜索您的字符串并查找所有不重叠的匹配项,然后返回该组。或者,您可以使用re.finditer()
来迭代Match对象,但是您需要使用match.group(1)
来获取大括号内的内容。这也是您在示例中需要更改的内容,match.group()
返回整个匹配而不是捕获的组,因为您需要为所需的组添加数字。
答案 2 :(得分:2)
>>> import re
>>> re.findall(r'{([^{}]*)}', '{a} { {b} c { {d} } }')
['a', 'b', 'd']