我很确定我在这里缺少一些非常基本的东西,因为我通常可以使用Python&正则表达式。我想看看提供的字符串是否包含至少一个数字,这是我正在经历的命令行,但总是变错...
>>> import re
>>> test_string = "123567890"
>>> pat = re.compile("[0-9]")
>>> pat.search(test_string) == True
False
在发布这篇文章之前,我尝试过其他几种排列而不是走得太远,我做错了什么?
答案 0 :(得分:4)
pat.search
不返回布尔值,而是返回MatchObject,因此您的比较将失败:
In [9]: p = pat.search(test_string)
In [10]: p
Out[10]: <_sre.SRE_Match at 0x3cfa608>
In [11]: type(p)
Out[11]: _sre.SRE_Match
请参阅re.search文档:
re.search(pattern,string,flags = 0)
扫描字符串,查找常规位置 表达式模式产生匹配,并返回相应的 MatchObject实例。如果字符串中没有位置匹配则返回None 模式;请注意,这与查找零长度不同 匹配字符串中的某个点。
答案 1 :(得分:0)
问题是re.search()
方法实际上并不返回bool
,而是返回专门的regexp. match object。 bool(pat.search(test_string))
应该返回True
,即:
>>> import re
>>> test_string = "123567890"
>>> pat = re.compile("[0-9]")
>>> bool(pat.search(test_string))
True
检查成功匹配的正常方法是使用if
结构,即:
>>> if pat.search(test_string): True
...
True
您可以对实现__nonzero__
或__len__
特殊方法之一的任何对象使用此缩写形式的真值测试。
答案 2 :(得分:0)
re.search在找到匹配项时返回MatchObject,而不是布尔值。当它不匹配时它会返回None,所以这会做你想要做的事情:
pat.search(test_string)!=None
答案 3 :(得分:0)
以下是使用匹配对象的方法。我通常需要一个来自匹配对象的True
/ False
,所以我总是把它保存起来。
>>> m = pat.search(test_string)
>>> bool(m) == True
True
>>> if m:
print "true"
true