regex 为什么replace函数在lambda函数内部失败而在lambda函数外部却没有失败?

3zwjbxry  于 2022-12-27  发布在  其他
关注(0)|答案(3)|浏览(149)
import re

input_text = "el dia 2022-12-23 o sino el dia 2022-09-23 10000-08-23"  #example

date_capture_pattern = r"([12]\d*-[01]\d-[0-3]\d)(\D*?)"

#input_text = re.sub(date_capture_pattern , lambda m: print(repr(m[1])) , input_text)
input_text = re.sub(date_capture_pattern , lambda m: m[1].replace("_-_", "-", 2) , input_text)

print(repr(input_text))

使用print()时,我注意到捕获组m[1]正确地捕获了它们,因为它能够正确地打印3个日期。
然而,我觉得lambda函数lambda m: m[1].replace("_-_", "-", 2)的语法(在python中)中有一些东西不允许替换,也就是说,即使lambda函数正确地接收到信息,它也不能返回它。
我需要的输出是

"el dia 2022_-_12_-_23 o sino el dia 2022_-_09_-_23 10000_-_08_-_23"

应该澄清的是,问题中的代码不会在控制台中生成任何错误,但是它不能正常工作,因为它仅限于删除原始字符串中的捕获组
lambda函数有什么问题吗?

euoag5mw

euoag5mw1#

lambda m: m[1].replace("-","_-_", 2) , input_text)

顺序应为"-",然后为"_-_"
您也可以使用一个简单的字符串函数replace()来实现这一点。
因为input_text是一个字符串。

input_text.replace("-","_-_")
sz81bmfz

sz81bmfz2#

您的替换逻辑关闭。您应该搜索-并替换为_-_。请使用此版本:

input_text = "el dia 2022-12-23 o sino el dia 2022-09-23 10000-08-23"
output = re.sub(r'[12]\d*-[01]\d-[0-3]\d', lambda m: m.group().replace("-", "_-_"), input_text)
print(output)

# el dia 2022_-_12_-_23 o sino el dia 2022_-_09_-_23 10000_-_08_-_23

另请注意,此处无需使用捕获组。

n1bvdmb6

n1bvdmb63#

使用lambda函数有什么原因吗?一个简单的替换就足够了。

代码:
input_text = "el dia 2022-12-23 o sino el dia 2022-09-23 10000-08-23"

output = input_text.replace('-', '_-_')
print(output)
输出:
el dia 2022_-_12_-_23 o sino el dia 2022_-_09_-_23 10000_-_08_-_23

相关问题