2015-06-20 2 views
0

Я пытаюсь сопоставить даты в строке, где дата отформатирована как (месяц dd, yyyy). Я смущен тем, что вижу, когда я использую шаблон regex ниже. Он соответствует только строкам, начинающимся с даты. Что мне не хватает?Дата regex python

>>> p = re.compile('[A-z]{3}\s{1,}\d{1,2}[,]\s{1,}\d{4}') 
>>> s = "xyz Dec 31, 2013 - Jan 4, 2014" 
>>> print p.match(s).start() 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
AttributeError: 'NoneType' object has no attribute 'start' 

>>> s = "Dec 31, 2013 - Jan 4, 2014" 
>>> print p.match(s).start() 
0 #Correct 

ответ

1

Используйте метод поиска вместо соответствия. Match сравнивает всю строку, но поиск находит соответствующую часть.

1
p = re.compile(r'.*?[A-Za-z]{3}\s{1,}\d{1,2}[,]\s{1,}\d{4}') 

match соответствует строке от начала start.if делает это не то же самое будет fail.In первый пример xyz будет потребляться [A-Za-z]{3}, но остальные строки не будут соответствовать.

Вы можете напрямую использовать свое регулярное выражение с re.findall и получить результат, не заботясь о местоположении матча.

2

Использование re.findall вместо re.match, он вернется к вам список всех матчей:

>>> s = "Dec 31, 2013 - Jan 4, 2014" 
>>> r = re.findall(r'[A-z]{3}\s{1,}\d{1,2}[,]\s{1,}\d{4}',s) 
>>> r 
['Dec 31, 2013', 'Jan 4, 2014'] 
>>> 
>>> s = 'xyz Dec 31, 2013 - Jan 4, 2014' 
>>> r = re.findall(r'[A-z]{3}\s{1,}\d{1,2}[,]\s{1,}\d{4}',s) 
>>> r 
['Dec 31, 2013', 'Jan 4, 2014'] 

От Python docs:

re.match(pattern, string, flags=0) Если ноль или более символов в начале строки сопоставить шаблон регулярного выражения, вернуть соответствующий экземпляр MatchObject

В другой стороны:

findall() матчи все вхождения шаблона, а не только первый как поиск() делает.