You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:09:46