代码之家  ›  专栏  ›  技术社区  ›  jmd_dk

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

  •  3
  • jmd_dk  · 技术社区  · 6 年前

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

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

    将在 str s .

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

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

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

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

    哪里 & 是“and”操作符(就像 | 是“or”运算符)。因此,括号将匹配同时不是数字的任何单词文字。问题是 & 运算符不存在,因此我无法找到解决方案。

    编辑

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

    2 回复  |  直到 6 年前
        1
  •  3
  •   Patrick Artner    6 年前

    你可以用双底片- \W 有什么 \w 不是-只是不允许它允许任何 \w :

    [^\W0-9]\w*
    

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

    Doku: regular-expression-syntax

        2
  •  1
  •   Zenith    6 年前

    您可以尝试使用

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

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

    或者,如果不需要使用regex。 str.isidentifier() 可能会做你想做的事。

    推荐文章