首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >匹配群id的广义替换

匹配群id的广义替换
EN

Stack Overflow用户
提问于 2021-11-05 01:00:23
回答 2查看 45关注 0票数 2

给定表单<digit>-<non-digit><non-digit>-<digit>的字符串,我需要删除连字符(在<non-digit>-<digit>中)。2-f变成2ff-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是超级强大的如果你知道你在做什么.谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-05 09:40:46

没有什么能阻止您用\1\2\3\4替换

代码语言:javascript
运行
复制
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) )

请参阅regex演示Python演示

这是可能的,因为指向未参与匹配的组的所有反向引用都是用一个空字符串初始化的,该字符串以Python3.5开头(在此之前,它们不是,这会导致问题,请参阅空字符串而不是不匹配的组错误,您必须使用一个可调用的替换参数)。

当然,(?<=\d)-(?=\D)|(?<=\D)-(?=\d)正则表达式在当前的场景中看起来要干净得多,但是如果边界模式的长度是可变的,则使用正面的外观而不是捕获组。

票数 1
EN

Stack Overflow用户

发布于 2021-11-05 13:43:51

您可以在替换中使用\1\2,使用regex PyPi模块分支复位组 (?|结合使用相同的组号进行替换。

代码语言:javascript
运行
复制
(?|(\d)-(\D)|(\D)-(\d))

注意到\D也可以匹配空格或换行符。如果要匹配数字以外的非空格字符,也可以使用[^\s\d]而不是\D

Python演示regex演示

例如:

代码语言:javascript
运行
复制
import regex

pattern = r"(?|(\d)-(\D)|(\D)-(\d))"
s = "2-f or f-2"

print(regex.sub(pattern, r"\1\2", s))

输出

代码语言:javascript
运行
复制
2f or f2
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69847565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档