我使用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。
- 删除所有的"~"。 查找"${objects}">
- 用"~"代替。
- 将所有[^s~]替换为'_'.
- [' ~ ']替换为"${对象}">
比尝试做一个大量的正则表达式更简单。