正则表达式匹配 Unicode 变量名称
Regex matching Unicode variable names
在Python2中,Python变量名只能包含ASCII字母、数字和下划线,且不能以数字开头。因此,
re.search(r'[_a-zA-Z][_a-zA-Z0-9]*', s)
将在 str
s
中找到匹配的 Python 名称。
在Python3中,字母不再局限于ASCII。我正在寻找一个新的正则表达式,它将匹配任何和所有合法的 Python 3 个变量名称。
根据 the docs,正则表达式中的 \w
将匹配任何 Unicode 字面量,包括数字和下划线。但是我不确定这个字符集是否包含那些可能在变量名中使用的字符。
即使字符集 \w
恰好包含可以合法构造 Python 3 个变量名称的字符,我如何使用它来创建我的正则表达式?只使用 \w+
也会匹配以数字开头的 "words",这是不好的。我想到了以下解决方案,
re.search(r'(\w&[^0-9])\w*', s)
其中 &
是 "and" 运算符(就像 |
是 "or" 运算符一样)。因此,括号将匹配任何同时不是数字的字面值。问题是 &
运算符不存在,所以我没有解决方案。
编辑
尽管 "double negative" 技巧(如下面 Patrick Artner 的回答中所述)也可以在 this question 中找到,请注意,这只是部分回答了我的问题。仅当我保证 \w
与合法的 Unicode 字符以及数字 0-9 完全匹配时,才可以使用 [^\W0-9]\w*
。我想要这些知识的来源,或者其他一些可以完成工作的正则表达式。
您可以使用双重否定 - \W
是 \w
不是的任何东西 - 只是不允许它允许任何 \w
:
[^\W0-9]\w*
基本上使用任何非 - non-wordcharacter 除了 0-9 后跟任何单词字符任意次数。
您可以尝试使用
^(?![0-9])\w+$
不会部分匹配无效的变量名
或者,如果您不需要使用正则表达式。 str.isidentifier()
可能会如你所愿。
在Python2中,Python变量名只能包含ASCII字母、数字和下划线,且不能以数字开头。因此,
re.search(r'[_a-zA-Z][_a-zA-Z0-9]*', s)
将在 str
s
中找到匹配的 Python 名称。
在Python3中,字母不再局限于ASCII。我正在寻找一个新的正则表达式,它将匹配任何和所有合法的 Python 3 个变量名称。
根据 the docs,正则表达式中的 \w
将匹配任何 Unicode 字面量,包括数字和下划线。但是我不确定这个字符集是否包含那些可能在变量名中使用的字符。
即使字符集 \w
恰好包含可以合法构造 Python 3 个变量名称的字符,我如何使用它来创建我的正则表达式?只使用 \w+
也会匹配以数字开头的 "words",这是不好的。我想到了以下解决方案,
re.search(r'(\w&[^0-9])\w*', s)
其中 &
是 "and" 运算符(就像 |
是 "or" 运算符一样)。因此,括号将匹配任何同时不是数字的字面值。问题是 &
运算符不存在,所以我没有解决方案。
编辑
尽管 "double negative" 技巧(如下面 Patrick Artner 的回答中所述)也可以在 this question 中找到,请注意,这只是部分回答了我的问题。仅当我保证 \w
与合法的 Unicode 字符以及数字 0-9 完全匹配时,才可以使用 [^\W0-9]\w*
。我想要这些知识的来源,或者其他一些可以完成工作的正则表达式。
您可以使用双重否定 - \W
是 \w
不是的任何东西 - 只是不允许它允许任何 \w
:
[^\W0-9]\w*
基本上使用任何非 - non-wordcharacter 除了 0-9 后跟任何单词字符任意次数。
您可以尝试使用
^(?![0-9])\w+$
不会部分匹配无效的变量名
或者,如果您不需要使用正则表达式。 str.isidentifier()
可能会如你所愿。