设置详细正则表达式

2024-05-06 02:15:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

# 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(...)

这更像是一个风格问题,真的。你知道吗


Tags: thereformatvariableswordsupsetfive
2条回答

琼几乎能很好地用各种方法摆脱牙套。我唯一要补充的是,如果您关心的是风格,并且您可以奢侈地使用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)

将大括号加倍工作,它告诉format将大括号视为普通字符(它将它们转义: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)

(这样可以避免将大括号加倍,并允许一次性“参数化”字数)

相关问题 更多 >