我使用下面的正则表达式来检查字符串是否包含字母数字,但我得到的结果是无。
>>> r = re.match('!^[0-9a-zA-Z]+$','_')
>>> print r
None
答案 0 :(得分:2)
!
在RegEx中没有任何特殊含义,您需要使用^
来否定匹配,就像这样
>>> re.match('^[^0-9a-zA-Z]+$','_')
<_sre.SRE_Match object; span=(0, 1), match='_'>
在Python 2.x中,
>>> re.match('^[^0-9a-zA-Z]+$','_')
<_sre.SRE_Match object at 0x7f435e75f238>
注意:只有当整个字符串中都包含非字母数字字符时,此RegEx才会为您提供匹配。
如果您想检查任何字符是否为非字母数字,那么您需要使用re.search
并放弃+
和$
,就像这样
>>> re.search('[^0-9a-zA-Z]', '123abcd!')
<_sre.SRE_Match object; span=(7, 8), match='!'>
这意味着在字符串中的任何位置查找0-9
,a-z
和A-Z
以外的任何字符。 (re.match
将尝试匹配字符串的开头。详细了解re.search
和re.match
here之间的差异。
注意:此问题的最佳解决方案是,使用str.isalnum
,就像这样
>>> "123abcdABCD".isalnum()
True
>>> "_".isalnum()
False
仅当整个字符串中包含字母数字字符时,才会返回True
。但是,如果您想查看字符串中的任何字符是否为字母数字,那么您需要使用any
这样的函数
>>> any(char.isalnum() for char in "_!@#%^$()*")
False
>>> any(char.isalnum() for char in "_!@#%^a()*")
True
答案 1 :(得分:0)
那是因为"_"
与正则表达式不匹配而且没有返回任何内容。你可以简单地使用
def contains_alphanumeric( input):
r=re.match('[0-9a-zA-Z]+', input)
if r==None:
return False
else:
return True
答案 2 :(得分:0)
您没有提及您尝试对代码执行的操作,具体而言,但我是正则表达式的粉丝,并且经常在我的代码中使用它们。它可能比其他一些选项使用更多的CPU周期,但我确实喜欢这种灵活性。
如果您想单独查看每个字符,则会将表达式的结果与原始字符串进行比较:
import re
def main():
data = "This is a @#%(*ing string."
match = re.findall(re.compile(r"[a-z0-9]",re.IGNORECASE),data)
if len(match) != len(data):
print("Uh-oh, spaghettios!")
else:
print("All good in the hood.")
if __name__ == '__main__':
main()
这将使用re.findall()来匹配表达式并返回结果列表。在此特定实例中,仅查找 字母数字字符:
>>> print(match)
['T', 'h', 'i', 's', 'i', 's', 'a', 'i', 'n', 'g', 's', 't', 'r', 'i', 'n', 'g']
请记住,&#34; []&#34;将被视为文字字符,除非使用范围,并且您可以使用&#34;()&#34;在re.match()中调用特定的结果组。
请不要犹豫,提出更多问题或者查看&#34; re&#34; https://docs.python.org/2/library/re.html
的模块信息