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
相关产品推荐
相关产品推荐

