Почему при условии, что регулярное выражение возвращает true? - PullRequest
1 голос
/ 09 августа 2010

Я хотел бы знать, почему следующее регулярное выражение возвращает true:

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

[0-9] будет соответствовать любой одной цифре, в данном случае 5. Но тогда 0 не соответствует%, поэтому следуетвозвращает false, но возвращает true.

Мой код может содержать синтаксические ошибки, но вы понимаете суть.

Ответы [ 4 ]

8 голосов
/ 09 августа 2010

reg.search () соответствует шаблону в любом месте строки (поэтому он соответствует 0%).Если вы хотите, чтобы вся строка соответствовала, попробуйте это:

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

^ - соответствует началу строки

$ - соответствует концу строки

5 голосов
/ 09 августа 2010

Это регулярное выражение будет соответствовать в 0% части 50%.

1 голос
/ 09 августа 2010

Как упомянуто 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%
1 голос
/ 09 августа 2010

Если вы ищете однозначные проценты внутри более длинной строки, вы можете использовать негативный вид сзади :

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...