Regex:如何组合一个条件来单独匹配任何非空格字符,同时忽略括号模式中的内容



我使用regex将字符串中的所有非空白字符转换为其他字符(如_)。我使用S来选择每个非空白字符,并将其替换为另一个字符。

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

返回
_______ __ _______ ______

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

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

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

总之,我想要一个正则表达式,可以把字符串像

Explore %{object} in further detail

并把它变成。

_______ %{object} __ _______ ______

您可以使用(%{[^{}]*})在组1中使用否定字符类捕获%{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

的额外调用替换所有非空白字符。
[^[{}]+(?=$|%{[^{}]*})

Regex演示

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

输出
_______ %{object} __ _______ ______

我将把它解决为两个问题,而不是一个regex。

  1. 删除所有的"~"。
  2. 查找"${objects}">
  3. 用"~"代替。
  4. 将所有[^s~]替换为'_'.
  5. [' ~ ']替换为"${对象}">

比尝试做一个大量的正则表达式更简单。

最新更新