我很确定我在这里遗漏了一些非常基本的东西,因为我通常可以使用 Python 和 Regex。我正在查看提供的字符串是否至少包含一个数字,这是我正在经历的命令行,但总是出错......
>>> import re
>>> test_string = "123567890"
>>> pat = re.compile("[0-9]")
>>> pat.search(test_string) == True
False
在发布此之前,我尝试了其他一些排列并且没有走得很远,我做错了什么?
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(模式,字符串,标志=0)
扫描字符串以查找正则表达式模式产生匹配的位置,并返回相应的 MatchObject 实例。如果字符串中没有位置与模式匹配,则返回 None;请注意,这与在字符串中的某个点找到零长度匹配不同。
问题是该re.search()
方法实际上并没有返回 a bool
,它返回一个专门的正则表达式。匹配对象。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
您可以对任何实现 the__nonzero__
或 __len__
special 方法之一的对象使用这种缩写形式的真值测试。
re.search在找到匹配项时返回MatchObject,而不是布尔值。当它不匹配时它确实返回 None ,所以这会做你想做的事情:
pat.search(test_string)!=None
这是您应该如何使用匹配对象的方法。我通常需要一个匹配对象的多个True
/ False
,所以我总是把它保存起来。
>>> m = pat.search(test_string)
>>> bool(m) == True
True
>>> if m:
print "true"
true