Python 与MatchObject.group()相关的re.sub()错误

Python 与MatchObject.group()相关的re.sub()错误,python,regex,Python,Regex,我有一个非常简单的re.sub工作,但无法让它正常工作 import re print re.sub(r"\d+", lambda x:x, "1 2 3 4 5") 匹配的字符串应按原样打印,因此预期输出为: 1 2 3 4 5 我得到的错误是: Traceback (most recent call last): File "_.py", line 2, in <module> print re.sub(r"\d+", lambda x:x, "1 2 3 4 5

我有一个非常简单的re.sub工作,但无法让它正常工作

import re
print re.sub(r"\d+", lambda x:x, "1 2 3 4 5")
匹配的字符串应按原样打印,因此预期输出为:

1 2 3 4 5
我得到的错误是:

Traceback (most recent call last):
  File "_.py", line 2, in <module>
    print re.sub(r"\d+", lambda x:x, "1 2 3 4 5")
  File "/home/radar/anaconda/lib/python2.7/re.py", line 155, in sub
    return _compile(pattern, flags).sub(repl, string, count)
TypeError: sequence item 0: expected string, _sre.SRE_Match found

替换函数由re.sub传递。直接返回匹配对象,而必须返回字符串;毕竟,这将是用来取代原来的比赛

您可以通过以下方式返回匹配的文本:

然而,您没有明确说明您预期会发生什么;上述内容将返回原始字符串,因为它将用自身替换每个数字:

>>> re.sub(r"\d+", lambda x: x.group(), "1 2 3 4 5")
'1 2 3 4 5'
或者,您可以将数字增加1,这需要转换为整数,然后在操作后,转换回字符串:

>>> re.sub(r"\d+", lambda x: str(int(x.group()) + 1), "1 2 3 4 5")
'2 3 4 5 6'

这不是正常的工作方式吗,你打印比赛。例如:print re.findallr\d+,1 2 3 4 5工作正常。@DarshanChaudhary:re.findall不进行替换,re.sub进行替换,您使用了一个函数来生成替换。通过使用re.sub,您希望在这里实现什么?我希望打印列表中数字的平方。我现在可以用:print re.subr\d+,lambda x:strintx.group**2,1,2,3,4 5来实现这一点。@DarshanChaudhary您试图将其插入回字符串中,而Python是强类型的,所以这种限制是有意义的。此外,这是记录在案的行为:@DarshanChaudhary:您在这里操作字符串。正则表达式只对字符串起作用,因此也需要返回字符串是合乎逻辑的。虽然这可以解决OP的问题,但解释一下它是如何实现的还是有帮助的。你到底改变了什么?为什么?@Jornsharpe:Martijn Pieters给了我更好的解释。这是真的,但并不能免除你自己做出更好回答的责任!你应该读过…当然。但评论中的权力讨论很诱人。
>>> re.sub(r"\d+", lambda x: str(int(x.group()) + 1), "1 2 3 4 5")
'2 3 4 5 6'
re.sub(r"\d+", lambda x: x.group(), "1 2 3 4 5")