re.rompile返回true,返回false,不允许符号

时间:2016-02-24 11:28:52

标签: python

我试图使用正则表达式检查变量是否接受了字母和数字。这是我的def:

def special_match(strg, search=re.compile(r'[a-z0-9]').search):
 if bool(search(strg)) is True:
    print ('Yes: ' + strg)
 elif:
    print ('nej: ')

while 1:
    variabel = raw_input('Enter something: ')
    special_match(variabel)

sys.exit()

似乎接受不允许符号与允许符号结合使用:

Enter something: qwerty
Yes: qwerty
Enter something: 1234
Yes: 1234
Enter something: !!!!      
nej!
Enter something: 1234qwer!!!!
Yes: 1234qwer!!!!
Enter something: 

不应该接受最后一个..我做错了什么?

3 个答案:

答案 0 :(得分:1)

search方法查找您提供的正则表达式,如果找到,则返回Match对象1234qwer!!! [a-z0-9] !!!!a!!!没有。 试试re.search(r"[^a-z0-9]",word)。这也将返回True。 你可以试试

True 如果这返回^,则表示您的单词具有除数字和字母之外的其他内容,并且应该被拒绝。

注意:{{1}}表示不是。

答案 1 :(得分:1)

所有正则表达式搜索正在检查是否至少存在一个字符。

如果您想要求整个字符串只包含这些字符,那么您可以使用:

r'^[a-z0-9]*$'

将模式锚定在字符串的开头和结尾处,并且仅当两者之间的所有字符都在指定的字符集中时才匹配。

请注意,这也将匹配空字符串。如果您希望至少需要一个字符,则可以将*更改为+

答案 2 :(得分:1)

正则表达式唯一能做的就是检查字符串中是否有数字或字母。如果您要检查是否包含数字和字母,则需要在开始和结束时锚定您的模式,然后添加重复:r'^[a-z0-9]+$'

请注意,不需要为此使用正则表达式:字符串isalnum()方法将执行相同的操作。

您的代码中还有其他一些奇怪的东西;你绝对不应该在函数签名中编译正则表达式并传递生成的搜索方法;你也不应该明确地将结果转换为bool,你不应该将bool与is True进行比较。一个更Pythonic版本,假设你想坚持正则表达式,将是:

def special_match(strg, search=None):
    if not search:
       search = re.compile(r'[a-z0-9]').search
    if search(strg):
       print ('Yes: ' + strg)
    else:
       print ('nej: ')

另请注意elif本身就是语法错误。