首页 > 解决方案 > 正则表达式:如何组合条件以单独匹配任何非空白字符,同时忽略括号模式内的内容

问题描述

我正在使用正则表达式将字符串中的所有非空白字符转换为其他字符(如_)。我\S用来选择每个非空白字符并用另一个字符替换它相当好。

import re
mystring = "Explore in further detail"
print(re.sub('\S', '_', mystring))

返回

_______ __ _______ ______

但是,我还想跳过与括号模式匹配的字符串部分,例如%{object}.

([^[\}]+)(?=$|\%\{)

我可以匹配括号之外的任何内容,但这并不能帮助我单独替换每个非空白字符。我怎样才能将两者结合起来?

总之,我想要一个正则表达式,可以将字符串转换为

Explore %{object} in further detail

并将其变成类似的东西。

_______ %{object} __ _______ ______

标签: pythonregex

解决方案


%{object}您可以使用第 1 组中的否定字符类捕获(%{[^{}]*})

在回调中,如果组 1 存在,则原样返回。否则返回下划线。

import re

mystring = "Explore %{object} in further detail"
print(re.sub(r'(%{[^{}]*})|\S', lambda x: x.group(1) if x.group(1) else '_', mystring))

输出

_______ %{object} __ _______ ______

使用您建议的带有否定字符类和前瞻的模式,您可以匹配除大括号之外的所有内容,直到您到达字符串的末尾或%{object}部分。

由于这也会匹配空格,因此在回调中,您可以.group()re.sub

[^[{}]+(?=$|%{[^{}]*})

正则表达式演示

import re

mystring = "Explore %{object} in further detail"
print(re.sub(r'[^[{}]+(?=$|%{[^{}]*})', lambda x: re.sub(r"\S", '_', x.group()), mystring))

输出

_______ %{object} __ _______ ______

推荐阅读