如何在pandas的str.contains()中添加\和|特殊字符?
如何在pandas中过滤包含\和|的无效用户名?
我明白你遇到的转义坑了——在正则里处理\和|这两个特殊字符,确实容易因为Python字符串和正则引擎的双重转义规则搞混。让我一步步帮你解决:
首先,你的核心需求是剔除包含特定符号(新增的\和|)的无效用户名,问题出在Python字符串转义和正则表达式转义的叠加冲突上。
问题根源
- 在正则表达式中:
\是转义符,|是“或”操作符,要匹配它们本身,必须转义成\\和\|。 - 但在Python普通字符串中,
\本身也是转义符,直接写\\的话,Python会把它解析成单个\传给正则引擎,导致正则无法识别这是转义操作。
最优解决方案:使用原始字符串
最省心的方式是用原始字符串(在字符串前加r),这样Python不会处理字符串里的转义符,正则引擎能直接拿到你写的内容,完美避开转义混乱。
修改后的代码如下:
import pandas as pd d = {'username': ["11111", "222!22", "21212!", "85511$", "8552$", "115522@@", "user\\name", "user|name"]} df = pd.DataFrame(data=d) # 用原始字符串定义正则,直接写出正则需要的转义格式 pattern = r'~|`|!|@|#|\$|%|\^|&|\*|\(|\)|-|_|\+|=|{|\[|}|]|:|;|"|\'|<|,>|\.|/|\?|\\|\|' filtered_df = df[~df['username'].str.contains(pattern)] print(filtered_df)
运行后只会保留纯数字的11111,所有包含无效字符(包括新增的\和|)的用户名都会被过滤掉。
更简洁的写法:正则字符集
你还可以把所有要匹配的符号放进**字符集[]**里,替代一堆|,代码更简洁高效:
# 字符集里大部分特殊字符无需转义,注意把-放在末尾避免被解析为范围 pattern = r'[~`!@#$%^&*()_+={}\[\]:;"\'<>,.?/\\|-]' filtered_df = df[~df['username'].str.contains(pattern)]
不用原始字符串的写法(不推荐)
如果不想用原始字符串,就得对\做双重转义(写四个\\\\),|转义成\|,代码会显得繁琐:
pattern = '~|`|!|@|#|\\$|%|\\^|&|\\*|\\(|\\)|-|_|\\+|=|{|\\[|}|]|:|;|"|\'|<|,>|\\.|/|\\?|\\\\|\\|'
总之,原始字符串能帮你避开转义的麻烦,是处理正则表达式的首选方式。
内容的提问来源于stack exchange,提问作者sectechguy
相关产品推荐
相关产品推荐

