1

我很确定我在这里遗漏了一些非常基本的东西,因为我通常可以使用 Python 和 Regex。我正在查看提供的字符串是否至少包含一个数字,这是我正在经历的命令行,但总是出错......

>>> import re
>>> test_string = "123567890"
>>> pat = re.compile("[0-9]")
>>> pat.search(test_string) == True
False

在发布此之前,我尝试了其他一些排列并且没有走得很远,我做错了什么?

4

4 回答 4

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(模式,字符串,标志=0)

扫描字符串以查找正则表达式模式产生匹配的位置,并返回相应的 MatchObject 实例。如果字符串中没有位置与模式匹配,则返回 None;请注意,这与在字符串中的某个点找到零长度匹配不同。

于 2012-06-30T23:16:33.663 回答
0

问题是该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 方法之一的对象使用这种缩写形式的真值测试。

于 2012-06-30T23:17:39.393 回答
0

re.search在找到匹配项时返回MatchObject,而不是布尔值。当它不匹配时它确实返回 None ,所以这会做你想做的事情:

pat.search(test_string)!=None
于 2012-06-30T23:18:44.807 回答
0

这是您应该如何使用匹配对象的方法。我通常需要一个匹配对象的多个True/ False,所以我总是把它保存起来。

>>> m = pat.search(test_string)
>>> bool(m) == True
True
>>> if m:
        print "true"
true
于 2012-06-30T23:19:29.213 回答