如何用 re.sub 捕获一个字符串,但也让部分结果再次被捕获?

我需要使用Python的re.sub来捕获字符串中的每一个 “H”,以及它的前一个字母(如果有的话)和后一个字母(如果有的话),以便将这组字母送入re.sub的替换函数,因为我们要对这三个字母中的任何一个字母施展魔法。

在这个例子中 “eHetaHḷ”,我将有两个组:”eHe “和 “aHḷ”,把它们送入替换函数,然后把 “ē “和 “āl “射出来。我可以这样做。

现在用这个。”eHeHḷ”,我需要两组:”eHe “和… … ‘ēHḷ’,也就是说,我需要第一个组的结果被下一个组捕获。

我只能用一个re.sub turn,而且我不能抓到后面的一个字母和前面的一个以上。有相当多的可能结果,所以我不能轻易地用ifelse我的方式来解决这个问题。

你有什么好办法吗?我是不是完全误解了Regex的操作方式?

解决方案:

re.sub 不能递归替换到之前的替换之上。

然而,您可以做的是根据字符的外观有条件地匹配较短或较大的组。H.

这种模式 r'\wH((?=\wH)\wH.|.)' 将匹配 eHeeHexxxeHeH!eHeH!x.

它的工作原理是使用 积极展望 (?=\wH),只有当当前位置后面有(字符+)时才会匹配。H).

所以 ((?=\wH)\wH.|.) 匹配 (\wH.) 如果 (\wH) 存在,否则 (.).

为了实现基于以下方面的差异化替换规则 H 数,你可以创建一个替换函数。

def create_substitution(x: re.match):
    match = x.group(0)
    if match.count('H') == 1:
        return 'custom handling of match xH.'
    elif match.count('H') > 1:
        return 'custom handling of match xHxH.'

你可以在你的替换中使用它。

result = re.sub(r'\wH((?=\wH)\wH.|.)', create_substitution, "eHeHḷ")

给TA打赏
共{{data.count}}人
人已打赏
未分类

boost::bind()会创建许多参数的副本。

2022-9-9 5:08:17

未分类

安卓。在回收器视图中点击图片按钮时,从Textview中传递文本。

2022-9-9 5:08:19

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索