Python正则表达式只捕获某些文本

时间:2011-09-20 20:51:13

标签: python regex

我试图在python中找到类似于Ruby函数扫描的功能。我的目标是获取列表中两个花括号之间的所有文本。如果字符串中有多对花括号,我希望列表中有多个条目。

当我运行此代码时:

 match = re.search(r'\{(.+)\}', request.params['upsell'])
 print match.group()

我匹配正确的文字。但是,捕获的内容包括花括号。我不想包含这个文本,我想包括介于两者之间的所有内容,但不是花括号谢谢!

3 个答案:

答案 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']