给定表单<digit>-<non-digit>
或<non-digit>-<digit>
的字符串,我需要删除连字符(在<non-digit>-<digit>
中)。2-f
变成2f
,f-2
变成f2
。
到目前为止,我已经有了(?:\d-\D)|(?:\D-\d)
,它可以找到模式,但我无法找到用空格替换连字符的方法。特别是:
sub
上面的正则表达式,它将替换周围的字符(因为它们是匹配的);(?:(\d)-(\D))|(?:(\D)-(\d))
明确捕捉字符,然后sub
与\1\2
将正确地处理2-f
,并将其转换为2f
.但!当然,这将使f-2
失败,因为这些字符位于第3组和第4组,所以我们需要使用\3\4
。尝试给组命名失败,因为所有名称都必须是唯一的。我知道我可以通过两个sub
语句来运行它,但是还有更优雅的解决方案吗?我知道regex是超级强大的如果你知道你在做什么.谢谢!
发布于 2021-11-05 09:40:46
没有什么能阻止您用\1\2\3\4
替换
import re
text = "2-f becomes 2f, f-2 becomes f2"
print( re.sub(r"(\d)-(\D)|(\D)-(\d)", r"\1\2\3\4", text) )
这是可能的,因为指向未参与匹配的组的所有反向引用都是用一个空字符串初始化的,该字符串以Python3.5开头(在此之前,它们不是,这会导致问题,请参阅空字符串而不是不匹配的组错误,您必须使用一个可调用的替换参数)。
当然,(?<=\d)-(?=\D)|(?<=\D)-(?=\d)
正则表达式在当前的场景中看起来要干净得多,但是如果边界模式的长度是可变的,则使用正面的外观而不是捕获组。
发布于 2021-11-05 13:43:51
https://stackoverflow.com/questions/69847565
复制相似问题