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

具有非捕获字符的python re.sub()的意外结果

  •  1
  • plalanne  · 技术社区  · 7 年前

    import re 
    
    re.sub(r'(?:\s)ff','fast-forward',' ff')
    'fast-forward'
    

    根据文件:

    ' fast-forward'
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Wiktor Stribiżew    7 年前

    non-capturing group 比赛 (?:\s) ff

    你想用一个 look-behind

    re.sub(r'(?<=\s)ff','fast-forward',' ff')
    

    regex demo

    re.sub(r'(\s)ff',r'\1fast-forward',' ff')
             ^  ^      ^^ 
    

    (\s) 将空白保存在组1内存缓冲区中,并 \1

    Python demo

    import re 
    print('"{}"'.format(re.sub(r'(?<=\s)ff','fast-forward',' ff')))
    # => " fast-forward"
    
        2
  •  0
  •   Olivier Melançon iacob    7 年前

    非捕获组仍与它包含的模式匹配。你想要表达的是一个“向后看”,它不匹配它的模式,只是断言它在匹配之前就存在了。

    \b 相反。它与 \w \W 字符,断言模式在单词的开头。

    import re
    
    re.sub(r'\bff\b', 'fast-forward', ' ff') # ' fast-forward'
    

    也要确保你只匹配 'ff' 'ffoo' .

    demo .