我想知道为什么跟随正则表达式返回true:
reg = re.compile (r'[0-9]%')
reg.search ("50%")
[0-9]
将匹配任何单个数字,在本例中为5.但是0与%不匹配,因此它应该返回false,但它返回true。
我的代码可能有语法错误,但你明白了它。
答案 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%