尝试设置详细的正则表达式时:
# 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(...)
这更像是一种风格问题,真的。
答案 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)
(避免将括号加倍并允许"参数化"单词数量一劳永逸)
答案 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)