正则表达式,好像字符串是一个变量

时间:2013-09-30 22:39:09

标签: python regex

我正在使用一个脚本来确定我的字符串是否是一个有效的变量。 这是非常基本的,但我似乎无法弄清楚如何使用正则表达式。

基本上我想要:

A-Z
a-z
0-9
no whitespace anywhere
no special char except _

这可能吗? 这就是我试过的:

re.match("[a-zA-Z0-9_,/S]*$", char_s):

4 个答案:

答案 0 :(得分:4)

这样的模式应该有效:

^[a-zA-Z_][a-zA-Z0-9_]*$

或更简单:

^(?!\d)\w+$

在这两种情况下,只要不以数字开头,它就会匹配一个由一个或多个字母,数字或下划线组成的字符串。

第二种模式中的(?!…)是负前瞻断言。它确保第一个字符不是数字。有关详细信息,请参阅manual

答案 1 :(得分:3)

除了提到的正则表达式之外,您还需要确保它不是reserved keywords之一:

and       del       from      not       while    
as        elif      global    or        with     
assert    else      if        pass      yield    
break     except    import    print              
class     exec      in        raise              
continue  finally   is        return             
def       for       lambda    try

这样的事情:

reserved = ["and", "del", "from", "not", "while", "as", "elif", "global", "or", "with", "assert", "else", "if", "pass", "yield", "break", "except", "import", "print", "class", "exec", "in", "raise", "continue", "finally", "is", "return", "def", "for", "lambda", "try"]

def is_valid(keyword):
    return (keyword not in reserved and
            re.match(r"^(?!\d)\w+$", keyword) # from p.s.w.g answer

或者像@nofinator建议你可以而且应该只使用keyword.iskeyword()

答案 2 :(得分:1)

re.match(r"^[^\W\d]\w*$", char_s):

单词\w字符等同于[a-zA-Z0-9_]。标识符不能以数字开头,因此第一个字符匹配[^\W\d],其余字符匹配\w*

答案 3 :(得分:1)

正确的方法:

Python 2

import re
import keyword
import tokenize

re.match(tokenize.Name+"$", char_s) and not keyword.iskeyword(char_s)

Python 3

import keyword

char_s.isidentifier() and not keyword.iskeyword(char_s)

请注意,Python 2的方法在Python 3上无声地失败。


当你看到这些问题时,首先要问的是“ Python是如何做到的?”因为几乎所有的时间它都向用户公开了一个方法。