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

Python 3正则表达式:如何在\w中排除下划线?

嘿,这个需求太常见了——在多语言场景下想利用\w的Unicode匹配能力,但又要剔除下划线,确实不能用[\w^_]这种错误写法(方括号里的^只有放在开头才是否定含义,放在中间就是普通字符)。我给你两个实用的解决方案:

方案1:利用补集反向排除(最简洁)

用[^\W_]就能完美实现需求,原理很直观:

  • \W是\w的补集,也就是所有非单词字符
  • [^\W]等价于\w(匹配所有Unicode单词字符)
  • 再加上_,[^\W_]就表示「匹配所有不是非单词字符,也不是下划线的字符」——刚好就是\w去掉下划线的效果

举个Python代码示例:

import re

# 测试字符串包含英文、中文、数字、下划线,还有希腊文
test_text = "Python_中文编程123_foo_bar_ελληνικά"

# 匹配所有Unicode单词字符,排除下划线
matches = re.findall(r'[^\W_]', test_text)
print(''.join(matches))
# 输出:Python中文编程123foobarελληνικά

方案2:明确指定Unicode属性类(更直观)

如果你想更清晰地控制匹配范围,可以直接用Unicode属性类组合:

  • \p{L}:匹配任意Unicode字母(覆盖中文、希腊文、日文等所有语言的字母)
  • \p{N}:匹配任意Unicode数字

组合后的[\p{L}\p{N}]完全等价于\w去掉下划线,因为\w在Unicode模式下就是\p{L}\p{N}_的集合。

代码示例:

import re

test_text = "Python_中文编程123_foo_bar_ελληνικά"
matches = re.findall(r'[\p{L}\p{N}]', test_text)
print(''.join(matches))
# 输出和上面完全一致

额外注意事项

  • 在Python 3中,re模块处理字符串时默认是Unicode感知的,所以\w会自动匹配所有Unicode单词字符;如果加上re.ASCII标志,\w就会退化为[a-zA-Z0-9_],此时上面的方案也只会匹配英文、数字并排除下划线。
  • 如果需要排除其他字符(比如除了下划线还要排除连字符),直接在补集里添加即可,比如[^\W_-]就能同时排除下划线和连字符。

内容的提问来源于stack exchange,提问作者Stephen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:29:17