为什么这提供正则表达式返回true?

时间:2010-08-09 02:10:35

标签: python regex

我想知道为什么跟随正则表达式返回true:

reg = re.compile (r'[0-9]%')
reg.search ("50%")

[0-9]将匹配任何单个数字,在本例中为5.但是0与%不匹配,因此它应该返回false,但它返回true。

我的代码可能有语法错误,但你明白了它。

4 个答案:

答案 0 :(得分:8)

reg.search()匹配字符串中任何位置的模式(因此它匹配0%)。如果您希望整个字符串匹配,请尝试以下操作:

re.compile(R '^ [0-9]%$')

^ - 匹配字符串的开头

$ - 匹配字符串的结尾

答案 1 :(得分:5)

此正则表达式将匹配0%的{​​{1}}部分。

答案 2 :(得分:1)

如果您要搜索较长字符串中的单位数百分比,可以使用negative lookbehind

In [171]: print(re.search('(?<!\d)\d%',"Foo is 5% complete"))
<_sre.SRE_Match object at 0xab302f8>

In [172]: print(re.search('(?<!\d)\d%',"Foo is 50% complete"))
None

In [173]: print(re.search('(?<!\d)\d%',"5% complete"))
<_sre.SRE_Match object at 0xab301a8>

In [174]: print(re.search('(?<!\d)\d%',"50% complete"))
None

答案 3 :(得分:1)

正如gfdunn2所提到的,它会对整个字符串进行“滚动匹配”。尽管如此,你可以采取一些措施来控制它。

下面的大括号{}可以控制你获得的字符数,因此它会给你更紧密的匹配。

>>> import re  

#exactly 1 digit and %
>>> test = re.compile(r'[0-9]{1}%')  
>>> print test.search("50%").group(0)  
0%  


#exactly 2 digits and %
>>> test = re.compile(r'[0-9]{2}%')  
>>> print test.search("50%").group(0)  
50%  


#one or more digits  
>>> test = re.compile(r'[0-9]+%')  
>>> print test.search("50%").group(0)  
50%  

#in the event you want to include floating point percentages  
>>> test = re.compile(r'[0-9.]+%')  
>>> print test.search("50.4%").group(0)  
50.4%

>>> print test.search("50.34%").group(0)
50.34%