正则表达式:\ w除下划线(添加到课程中,然后从课程中排除)

时间:2019-02-09 03:21:46

标签: python regex python-3.x

此问题适用于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表示的所有内容开头的字符类,然后继续从该类中删除下划线。”

有想法吗?

1 个答案:

答案 0 :(得分:3)

我有两个选择。

  1. [^\W_]

    这非常有效,并且可以完全满足您的要求。这也很简单。

  2. 使用regex[[\w]--[_]],请注意,您需要设置“ V1”标志,因此需要

    r = regex.compile(r"(?V1)[\w--_]")
    

    r = regex.compile(r"[\w--_]", flags=regex.V1)
    

    如果您熟悉Matthew Barnett的regex模块,它比Python的股票re更强大,那么这看起来更好(可读性)IMO。