正则表达式:如何将 re.sub 与可变数量的元素一起使用?

Posted

技术标签:

【中文标题】正则表达式:如何将 re.sub 与可变数量的元素一起使用?【英文标题】:Regex: how to use re.sub with variable number of elements? 【发布时间】:2019-03-20 20:52:51 【问题描述】:

我试图用“x 或 y”替换文本语料库中的 x;y 模式,除了元素的数量是可变的,所以有时会有 3 个或更多元素,即 x;y; z(最大值为 9)。

我正在尝试使用正则表达式执行此操作,但我不确定如何执行此操作,以便我可以根据存在的元素数量进行替换。所以我的意思是,如果我使用带有如下变量组件的正则表达式

part = '(;[\w\s]+)' regex = '\(([\w\s]+);([\w\s]+)?\)'.format(part) re.sub(regex,/1 or /2 or /3, text)

当大括号中只有 2 个元素时,我有时会得到一个额外的“或”(如果我增加变量元素的数量会更多),这是我不想要的。另一种方法是使用不同数量的可变部分多次执行此操作,但代码会非常笨重。我想知道是否有任何方法可以使用正则表达式方法实现这一目标?任何想法都将不胜感激。

我正在使用带有 spyder 的 python3.5。

【问题讨论】:

是否可以将x;y 替换为x or y 还是必须是x or y(不带大括号)? 我的意图是把大括号也去掉 【参考方案1】:

这个场景对于常规的搜索和替换操作来说有点太多了,所以我建议传入一个函数来动态生成替换字符串。

import re

text = 'There goes my cat;dog playing in the street;garden.'

def replacer(m):
    return m.group(1).replace(';', ' or ')

output = re.sub(r'\((\w;?)*\w)\', replacer, text)

print(output)

输出:

我的猫或狗在街上或花园里玩耍。

【讨论】:

以上是关于正则表达式:如何将 re.sub 与可变数量的元素一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

re.sub

re模块

正则表达式re.sub

您如何使用正则表达式“量化”可变数量的行?

Python正则表达式

常用模块