创建一个lambda函数,使我能够识别regex捕获组是否等于另一个捕获组,如果是,则替换它


import re
input_text = "Asegurarse que halla 4(4) o 5( 5  ) de ellos, también 24(24 48), o sino 24, (24 )no 66(70 y seis), o () 56(), 56(5 6) ssd 56"
lambda_fuction_result = lambda m: re.sub(r"", "", m.group())
input_text = re.sub(capture_groups_with_regex, lambda_fuction_result, input_text)
print(repr(input_text)) # --> output

我需要获得的正确输出

"Asegurarse que halla 4 o 5 de ellos, también 24(24 48), o sino 24, (24 )no 66(70 y seis), o () 56(), 56(5 6) ssd 56"

我需要从主字符串中删除在括号之间重复输入的数据,因为它们是多余的澄清。只有当括号紧跟在数字之后,并且括号内的数字与括号前的数字完全相等时,才应进行这些替换。您还必须考虑到括号内的数值必须是单独的,并且括号中不能再有其他数字。

正则表达式应该看起来像这个r"d*[s|]([s|]*d*[s|]*)[s|]",但它有一些验证,允许我评估括号前的d*等于括号内的d*

据我所知,您的任务是删除带数字的括号,如果它等于括号之前的数字。

首先,您需要一个正则表达式,它匹配单独捕获组中括号中的数字和数字:

(d+)s*(s*(d+)s*)

链接到演示

为了检查两个捕获组的值是否相等,我们可以利用re.sub()的特性,并将函数传递给第二个参数,该参数将比较组并返回数字或完全匹配。

def replace(match):
if match.group(1) == match.group(2):
return match.group(1)
else:
return match.group(0)  # keep same
input_text = "this 0(   0) is 0 (1   ) test 100    ( 1 0 0   ) string 1(1)."
result = re.sub(r"(d+)s*(s*(d+)s*)", replace, input_text)

让我们缩短我们的功能。使用索引(例如match[0](访问捕获组更为紧凑。此外,我们还可以应用一些python魔术。在python中,True等于1False等于0(您可能已经注意到(我们的replace()函数返回组0或组1。将所有这些结合在一起,我们可以使用条件本身作为组的索引:

def replace(match):
return match.group(match.group(1) == match.group(2))
# OR
def replace(match):
return match[match[1] == match[2]]
# OR
replace = lambda m: m[m[1] == m[2]]

代码的缩短版本:

input_text = "this 0(   0) is 0 (1   ) test 100    ( 1 0 0   ) string 1(1)."
result = re.sub(r"(d+)s*(s*(d+)s*)", lambda m: m[m[1] == m[2]], input_text)

输出:

this 0 is 0 (1   ) test 100    ( 1 0 0   ) string 1.

上升在写这个答案时,我完全忘记了backreferences

有一种更好的方法来实现这一点:

input_text = "this 0(   0) is 0 (1   ) test 100    ( 1 0 0   ) string 1(1)."
result = re.sub(r"(d+)s*(s*1s*)", r"1", input_text)

这里使用1,我们让正则表达式引擎只匹配相等的数字来完成所有的工作。链接到演示

相关内容

最新更新