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
等于1
,False
等于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
,我们让正则表达式引擎只匹配相等的数字来完成所有的工作。链接到演示。