我需要帮助制定一个特定的正则表达式

时间:2017-09-22 17:19:32

标签: python regex python-3.x

我不认为自己是正则表达式中的新手,但我似乎发现了一个难以理解的问题(它也是星期五晚上,所以大脑没有达到最佳表现)。

我试图用一些其他值替换字符串中的占位符。我很难获得一种行为符合我想要的语法。 我的占位符具有以下格式:{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()尝试这样做,但只要我满足一个标准子集,我就会在此过程中失去另一个。我开始认为可能无法在一个命令中完成。

干杯!

2 个答案:

答案 0 :(得分:2)

如果您能够使用较新的regex模块,则可以使用(*SKIP)(*FAIL)

{{.*?}}(*SKIP)(*FAIL)|{.*?}

a demo on regex101.com

<小时/> 细分,这说:

{{.*?}}(*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'