Python正则表达式: making multiple different substitutions in a single pass using Groups

标签 python regex substitution

我的任务是获取一个字符串,查找该字符串中两种不同类型匹配的所有实例,并对每种类型的每个匹配执行相似但不同的替换,所有这些都使用单个正则表达式和单个传递通过re.sub()

具体来说,我正在寻找任何 <<=并将它们替换为 >>=分别。每个需要替换的比较运算符位于 \w* 定义的两个单词之间。和零个或多个空格\s*两侧。

我找到了一个正则表达式,可以找到所有必要的匹配项并将它们分为有用的组:

((\b\w*(\s*<\s*)\w*\b)|(\b\w*(\s*<=\s*)\w*\b))+

这将解析字符串,以便匹配所有满足搜索条件的比较,并且所有 <将在比赛组 \3以及所有<=将在比赛组 \5

我的问题是这样的:有没有办法替换所有\3' > '以及所有\5' >= '单次调用 re.sub() 中?我已阅读 sub 的文档python 中的方法 re但一直没能找到方法,可能是由于我对整个系统的语法和行为的熟悉程度有限。

我被允许并期望在替换之前单独编译正则表达式,因此最终设置将如下所示:

r1 = re.compile(r"((\b\w*(\s*<\s*)\w*\b)|(\b\w*(\s*<=\s*)\w*\b))+")
subStr = r" ??? " 

r1.sub( ???, subStr ??? )

以下是一些输入/输出示例:

输入字符串:

"v1 < v2 v3 <= v4 v5 > v6 v7 >= v8"

运行替换会产生:

"v1 > v2 v3 >= v4 v5 > v6 v7 >= v8"

将我的模式和输入字符串插入 https://regex101.com/对于 python,将显示我的模式如何以我描述的方式匹配输入字符串。

最佳答案

您只需将=设为可选并捕获<:

周围的部分
re.sub(r'\b(?<=\w)(\s*)<(=?\s*\w)', r'\1>\2', s)

出于效率原因,我以单词边界 \b 开始该模式。 ,以下回顾(?<=\w)确保至少有一个单词字符。

关于Python正则表达式: making multiple different substitutions in a single pass using Groups,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44123720/

相关文章:

python - 匹配两个网格进行数据分析,对于我的问题有好的算法吗?

python - 获取第三级或第四级 JSON 键的值

javascript - 在逗号中替换后跟javascript中的双引号

static - 根据目标依赖关系使目标包含子目录

python - 在内联标记内进行替换,同时转义空白

python - 如何为列表中的每个邻居调用函数?

python - tp_clear、tp_dealloc 和 tp_free 之间有什么区别?

javascript - 任何不是 - 或任何单词字符的正则表达式

javascript - fs.readdir 和 fs.readfile 和正则表达式

python - 在 Python 中用单个空格替换多个空格