代码之家  ›  专栏  ›  技术社区  ›  Jan

设置详细正则表达式

  •  3
  • Jan  · 技术社区  · 7 年前

    在尝试设置详细的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 回复  |  直到 7 年前
        1
  •  3
  •   Jean-François Fabre    7 年前

    双倍的牙套,它告诉我们 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)
    

    (它避免了大括号的两倍,并允许一次性地“参数化”字数)

        2
  •  2
  •   bphi    7 年前

    琼几乎涵盖了所有逃离花括号的方法相当好。我唯一想补充的是,如果你关心的是风格,你有使用 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)