我想替换字符串中的所有匹配项,并获取匹配项的数组。
以下是使用两个函数的方法:
str = "foo123bar456"
nums = re.findall(r'\d+', str)
str = re.sub(r'\d+', '', str)
但这不必要地两次通过字符串。我怎么能一次性做到这一点?
答案 0 :(得分:2)
在re.sub
中使用lambda函数:
>>> str = "foo123bar456"
>>> arr=[]
>>> print re.sub(r'(\d+)', lambda m: arr.append(m.group(1)), str)
foobar
>>> print arr
['123', '456']
答案 1 :(得分:1)
在re.sub
中,参数repl
可以是返回字符串的函数。我们可以使用它将匹配项添加到列表中:
import re
def substitute(string):
def _sub(match):
matches.append(match)
return ''
matches = []
new_string = re.sub(r'\d+', _sub, string)
return new_string, matches
print(substitute('foo123bar456'))
> ('foobar', [<_sre.SRE_Match object; span=(3, 6), match='123'>, <_sre.SRE_Match object; span=(9, 12), match='456'>])