正则表达式匹配Unicode变量名称

时间:2018-03-04 21:26:35

标签: python regex python-3.x unicode unicode-literals

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

str

会在s \w中找到匹配的Python名称。

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

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

即使字符集\w+包含可以合法构造Python 3变量名称的字符,我如何使用它来创建我的正则表达式?仅使用re.search(r'(\w&[^0-9])\w*', s) 也会匹配以数字开头的“单词”,这是不好的。我有以下解决方案,

&

其中|是“和”运算符(就像&是“或”运算符)。因此,括号将匹配任何同时不是数字的单词文字。这个问题是[^\W0-9]\w*运算符不存在,所以我没有解决方案。

修改

虽然“双重否定”技巧(如Patrick Artner的答案中所述)也可以在this question中找到,但请注意,这只能部分回答我的问题。只有在我保证\w与合法的Unicode字符以及数字0-9完全匹配时,才能使用Q = tf.placeholder(tf.float32, shape=(None, 15)) word_level = Embedding ( vocab_size , 100 , input_length=15)(Q) #shape(?,15,100) Wb = tf.Variable(tf.zeros([100, 100])) C = tf.matmul( word_level ,Wb) 。我希望获得这些知识的来源,或其他一些可以完成工作的正则表达式。

2 个答案:

答案 0 :(得分:2)

您可以使用双重否定 - \W\w不是的任何内容 - 只是禁止它允许任何\w

[^\W0-9]\w*

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

Doku:regular-expression-syntax

答案 1 :(得分:1)

您可以尝试使用

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

哪个部分不匹配无效的变量名称

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