3

在 Python 2 中,Python 变量名仅包含 ASCII 字母、数字和下划线,并且不能以数字开头。因此,

 re.search(r'[_a-zA-Z][_a-zA-Z0-9]*', s)

将在str s.

在 Python 3 中,字母不再局限于 ASCII。我正在寻找一个新的正则表达式,它将匹配任何和所有合法的 Python 3 变量名。

根据文档\w正则表达式将匹配任何 Unicode 单词文字,包括数字和下划线。然而,我不确定这个字符集是否完全包含可能在变量名中使用的那些字符。

即使字符集\w完全包含可以合法构造 Python 3 变量名称的字符,我如何使用它来创建我的正则表达式?使用 just\w+也会匹配以数字开头的“单词”,这是不好的。我想到了以下解决方案,

re.search(r'(\w&[^0-9])\w*', s)

“and”运算符在哪里&(就像|“or”运算符一样)。因此,括号将匹配任何同时不是数字的单词文字。问题是&运营商不存在,所以我没有解决方案。

编辑

虽然在这个问题中也可以找到“双重否定”技巧(正如下面 Patrick Artner 的回答中所解释的),但请注意,这只是部分回答了我的问题。[^\W0-9]\w*仅当我保证\w与合法的 Unicode 字符以及数字 0-9 完全匹配时才使用。我想要这个知识的来源,或者其他一些可以完成工作的正则表达式。

4

2 回答 2

3

您可以使用双重否定 -\W不是任何东西\w- 只是不允许它允许任何\w

[^\W0-9]\w*

基本上使用任何非-非单词字符,除了 0-9 后跟任意单词字符任意次数。

Doku:正则表达式语法

于 2018-03-04T21:37:00.617 回答
1

你可以尝试使用

^(?![0-9])\w+$

不会部分匹配无效的变量名

或者,如果您不需要使用正则表达式。str.isidentifier()可能会做你想做的事。

于 2018-03-04T21:48:42.687 回答