设置详细的正则表达式

时间:2018-06-08 15:51:34

标签: python regex

尝试设置详细的正则表达式时:

# set up variables
ankerwords = ['beerdigt','bestattet','begraben','beigesetzt']

# combine the words, five words before/after
rx = re.compile(r'''
    (?:\b\w+\W+){5} # five words before
    (?:{})
    (?:\W+\w+\b){5} # five words thereafter
    '''.format("|".join(ankerwords)), re.X)

这会引发错误IndexError: tuple index out of range

<小时/> 我知道这是因为表达式中的{5}但是如何绕过它而不将字符串分成几部分,即

'''(?:\b\w+\W+){5}''' + '(?:{})'.format(...)

这更像是一种风格问题,真的。

2 个答案:

答案 0 :(得分:3)

将大括号的工作加倍,它告诉format将花括号视为普通的char(它会逃脱它们:How can I print literal curly-brace characters in python string and also use .format on it?):

rx = re.compile(r'''
    (?:\b\w+\W+){{5}} # five words before
    (?:{})
    (?:\W+\w+\b){{5}} # five words thereafter
    '''.format("|".join(ankerwords)), re.X)

或使用旧式%格式:

rx = re.compile(r'''
    (?:\b\w+\W+){5} # five words before
    (?:%s)
    (?:\W+\w+\b){5} # five words thereafter
    ''' % ("|".join(ankerwords)), re.X)

在这种情况下的另一种方式,因为{5}重复,可能是这样的:

rx = re.compile(r'''
    (?:\b\w+\W+){five} # five words before
    (?:{expr})
    (?:\W+\w+\b){five} # five words thereafter
    '''.format(expr="|".join(ankerwords),five="{5}", re.X)

(避免将括号加倍并允许&#34;参数化&#34;单词数量一劳永逸)

答案 1 :(得分:2)

Jean几乎涵盖了完全摆脱花括号的各种方式。我唯一要补充的是,如果您的关注是风格,并且您可以使用Python 3.6+,那么您可以通过

使其更具可读性
rx = re.compile(fr'''
    (?:\b\w+\W+){{5}} # five words before
    (?:{"|".join(ankerwords)})
    (?:\W+\w+\b){{5}} # five words thereafter
    ''', re.X)