我不认为自己是正则表达式中的新手,但我似乎发现了一个难以理解的问题(它也是星期五晚上,所以大脑没有达到最佳表现)。
我试图用一些其他值替换字符串中的占位符。我很难获得一种行为符合我想要的语法。
我的占位符具有以下格式:{swap}
我希望它能够捕获并替换它们:
{swap} # NewValue
x{swap}x # xNewValuex
{swap}x # NewValuex
x{swap} # xNewValue
但我希望它不匹配这些:
{{swap}} # NOT {NewValue}
x{{swap}}x # NOT x{NewValue}x
{{swap}}x # NOT {NewValue}x
x{{swap}} # NOT x{NewValue}
在上述所有情况中,x
可以是任何长度的任何字符串,不管是" word"或不。
我尝试使用python3' s re.sub()
尝试这样做,但只要我满足一个标准子集,我就会在此过程中失去另一个。我开始认为可能无法在一个命令中完成。
干杯!
答案 0 :(得分:2)
如果您能够使用较新的regex
模块,则可以使用(*SKIP)(*FAIL)
:
{{.*?}}(*SKIP)(*FAIL)|{.*?}
<小时/>
细分,这说:
{{.*?}}(*SKIP)(*FAIL) # match any {{...}} and "throw them away"
| # or ...
{.*?} # match your desired pattern
<小时/> 在
Python
中,这将是:
import regex as re
rx = re.compile(r'{{.*?}}(*SKIP)(*FAIL)|{.*?}')
string = """
{swap}
x{swap}x
{swap}x
x{swap}
{{swap}}
x{{swap}}x
{{swap}}x
x{{swap}}"""
string = rx.sub('NewValue', string)
print(string)
这会产生:
NewValue
xNewValuex
NewValuex
xNewValue
{{swap}}
x{{swap}}x
{{swap}}x
x{{swap}}
<小时/> 为了完整起见,您还可以使用
Python
自己的re
模块实现此目的,但在此,您需要稍微调整的模式以及替换功能:< p>
import re
rx = re.compile(r'{{.*?}}|({.*?})')
string = """
{swap}
x{swap}x
{swap}x
x{swap}
{{swap}}
x{{swap}}x
{{swap}}x
x{{swap}}"""
def repl(match):
if match.group(1) is not None:
return "NewValue"
else:
return match.group(0)
string = rx.sub(repl, string)
print(string)
答案 1 :(得分:1)
使用负向前瞻和后视:
s1 = "x{swap}x"
s2 = "x{{swap}}x"
pattern = r"(?<!\{)\{[^}]+\}(?!})"
re.sub(pattern, "foo", s1)
#'xfoox'
re.sub(pattern, "foo", s2)
#'x{{swap}}x'