此问题适用于Python 3正则表达式。我认为它也可能适用于其他语言。
这个问题很容易被误解,所以我会谨慎地描述它。
作为背景,\w
表示“单词字符”。在某些情况下,Python 3会将其视为[a-zA-Z0-9_]
,但是如果正则表达式是字符串,则它将支持Unicode,因此\w
的意思是“任何Unicode字字符”。通常,这是一件好事,因为人们使用不同的语言,并且很难一次为所有语言构造一个[a-zA-Z0-9_]
之类的范围。因此,我认为\w
在多语言环境中最有用。
但是有一个问题:如果您不希望对下划线进行匹配,因为您不认为下划线确实是单词字符(对于您的特定应用程序),该怎么办?
如果您只专注于英语应用程序,那么最好的解决方案可能是完全跳过\w
并仅使用[a-zA-Z0-9]
。但是,如果您专注于全局应用程序,并且不想使用下划线,那么看来您可能处在非常不幸的境地。我还没有做,但是我想写一个可以代表100种语言的范围真的很困难,只是为了避免下划线。
所以我的问题是:有没有办法使用\w
来匹配任何Unicode单词字符,但是又以某种方式还从类中排除了下划线(或其他不想要的字符)?我认为我没有看到过类似的描述,但这很有用。类似于[\w^_]
。当然,这实际上是行不通的,但是我的意思是“使用以\w
表示的所有内容开头的字符类,然后继续从该类中删除下划线。”
有想法吗?
答案 0 :(得分:3)
我有两个选择。
[^\W_]
这非常有效,并且可以完全满足您的要求。这也很简单。
使用regex:[[\w]--[_]]
,请注意,您需要设置“ V1”标志,因此需要
r = regex.compile(r"(?V1)[\w--_]")
或
r = regex.compile(r"[\w--_]", flags=regex.V1)
如果您熟悉Matthew Barnett的regex
模块,它比Python的股票re
更强大,那么这看起来更好(可读性)IMO。