【发布时间】:2018-08-12 12:44:26
【问题描述】:
在 Python 2 中,Python 变量名仅包含 ASCII 字母、数字和下划线,并且不能以数字开头。因此,
re.search(r'[_a-zA-Z][_a-zA-Z0-9]*', s)
将在 str s 中找到匹配的 Python 名称。
在 Python 3 中,字母不再局限于 ASCII。我正在寻找一个新的正则表达式,它将匹配任何和所有合法的 Python 3 变量名。
根据the docs,正则表达式中的\w 将匹配任何Unicode 字面值,包括数字和下划线。然而,我不确定这个字符集是否正好包含那些可能在变量名中使用的字符。
即使字符集 \w 包含可以合法构造 Python 3 变量名称的字符,我如何使用它来创建我的正则表达式?仅使用\w+ 也会匹配以数字开头的“单词”,这是不好的。我想到了以下解决方案,
re.search(r'(\w&[^0-9])\w*', s)
其中& 是“与”运算符(就像| 是“或”运算符一样)。因此,括号将匹配任何同时不是数字的单词文字。这个问题是 & 运算符不存在,所以我没有解决方案。
编辑
虽然在this question 中也可以找到“双重否定”技巧(正如下面 Patrick Artner 的回答中所解释的),但请注意,这只是部分回答了我的问题。仅当我保证 \w 与合法的 Unicode 字符以及数字 0-9 完全匹配时,使用 [^\W0-9]\w* 才有效。我想要这个知识的来源,或者其他一些可以完成工作的正则表达式。
【问题讨论】:
-
How can I exclude some characters from a class? 的可能重复项 - 用于 perl - 但并非相同...
-
请参阅PEP 3131,了解非 ASCII 标识符中允许的内容。以下是该 PEP 中从 Unicode 4.1 开始的有效开始和继续字符列表:dcl.hpi.uni-potsdam.de/home/loewis/table-3131.html
标签: python regex python-3.x unicode unicode-literals