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

python-如何向str.contains()添加\和

  •  1
  • sectechguy  · 技术社区  · 5 年前

    我正在清理熊猫数据框中的一列,以清除包含某些字符的垃圾用户名。示例如下:

    d = {'username': ["11111", "222!22", "21212!", "85511$", "8552$", "115522@@"]}
    df = pd.DataFrame(data=d)
    
        username
    0   11111
    1   222!22
    2   21212!
    3   85511$
    4   8552$
    5   115522@@
    ....
    

    我正在使用以下工具,它按预期工作:

    df[~df['username'].str.contains('~|`|!|@|#|\$|%|\^|&|\*|\(|\)|-|_|\+|=|{|\[|}|]|:|;|"|\'|<|,|>|\.|/|\?')]
    

    但我想再添加两个字符:

    \ |

    当我试图添加这些像 \\ 对于 \ \| 对于 γ 但我收到错误。我该怎么办?

    2 回复  |  直到 5 年前
        1
  •  3
  •   Marjan Moderc    5 年前

    尝试添加 r 在字符串前面,以便python将字符串解释为原始字符串:

    df[~df['username'].str.contains(r'~|`|!|@|#|\$|%|\^|&|\*|\(|\)|-|_|\+|=|{|\[|}|]|:|;|"|\'|<|,|>|\.|/|\?')]
    
        2
  •  2
  •   jpp    5 年前

    您可以避免手动指定 | 通过条件 re.escape :

    import re
    
    chars = """~`!@#$%^&*()-_+={[}]:;"'<,>./?\|"""
    regex_search = '|'.join(map(re.escape, chars))
    
    res = df[~df['username'].str.contains(regex_search)]
    

    本用例在 the docs 它还建议:从python 3.7开始,只转义正则表达式中具有特殊含义的字符。