在Python 2中,Python变量名仅包含ASCII字母、数字和下划线,并且不能以数字开头。因此,
re.search(r'[_a-zA-Z][_a-zA-Z0-9]*', s)将在str s中找到匹配的Python名称。
在Python 3中,字母不再局限于ASCII。我正在寻找一个新的正则表达式,将匹配任何和所有合法的Python3变量名。
根据the docs的说法,正则表达式中的\w将匹配任何Unicode单词文字,包括数字和下划线。但是,我不确定这个字符集是否包含变量名称中可能使用的字符。
即使字符集\w包含可以合法构造Python3变量名的字符,我如何使用它来创建我的正则表达式?只使用\w+也会匹配以数字开头的“单词”,这是不好的。我有以下的解决方案:
re.search(r'(\w&[^0-9])\w*', s)其中,&是“与”运算符(就像|是“或”运算符一样)。因此,括号将匹配同时不是数字的任何单词文字。这样做的问题是&运算符不存在,所以我没有解决方案。
编辑
虽然在this question中也可以找到“双重否定”技巧(正如Patrick Artner在下面的答案中所解释的那样),但请注意,这只回答了我的问题的一部分。只有在保证\w与合法的Unicode字符加上数字0-9完全匹配的情况下,才能使用[^\W0-9]\w*。我想要一个这种知识的来源,或一些其他正则表达式,使工作完成。
发布于 2018-03-05 05:37:01
您可以使用双重否定- \W是\w不是的任何东西-只是不允许它允许任何\w
[^\W0-9]\w*本质上是使用除0-9之外的任何非单词字符,后跟任何单词字符任意次数。
发布于 2018-03-05 05:48:43
您可以尝试使用
^(?![0-9])\w+$它不会部分匹配无效的变量名
或者,如果您不需要使用regex。str.isidentifier()可能会做你想做的事情。
https://stackoverflow.com/questions/49100678
复制相似问题