2015-08-13 2 views
1

У меня есть программа, в которой пользователь может ввести строку и указать дату в строке. Я использую RegEx, чтобы соответствовать \d+\/\d+\/\d+ извлечь дату из строки, но по какой-то причине в моем тестовом случае, только последняя запись есть возможность работатьPython не может обработать дату с помощью регулярного выражения

import datetime 
import re 
dateList = [] 
dates = ["Foo (8/15/15) Bar", "(8/15/15)", "8/15/15"] 
reg = re.compile('(\d+\/\d+\/\d+)') 
for date in dates: 
    matching = reg.match(date) 
    if matching is not None: 
     print date, matching.group(1) 
    else: 
     print date, "is not valid date" 

возвращается

Foo (8/15/15) Bar is not valid date 
(8/15/15) is not valid date 
8/15/15 8/15/15 

Что-то не так с моим RegEx? Я тестировал его с RegEx101.com и, казалось, прекрасно работать

+0

, если вы не хотите изучать регулярное выражение, я предлагаю вам использовать парсер [dateutil] (https://dateutil.readthedocs.org/en/latest/parser.html) – miraculixx

ответ

1

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

import datetime 
import re 
dateList = [] 
dates = ["Foo (8/15/15) Bar", "(8/15/15)", "8/15/15"] 
reg = re.compile('([0-9]+/[0-9]+/[0-9]+)') 
for date in dates: 
    matching = reg.search(date) # <- .search instead of .match 
    if matching is not None: 
     print(date, matching.group(1)) 
    else: 
     print(date, "is not valid date") 
+1

Обратите внимание: '\ d' является ** не ** псевдоним для '[0-9]' в режиме Unicode, который является значением по умолчанию. См. Мой ответ для большего контекста. – zopieux

+0

согласовано и обновлено. –

1

Вы ищете search(), не match().

date_re = re.compile('([0-9]{2})/([0-9]{2})/([0-9]{2})') 
e = date_re.match('foo 01/02/13') 
# e is None 
e = date_re.search('foo 01/02/13') 
# e.groups() == ('01', '02', '13') 

Не используйте \d где вы ожидаете ASCII 0-9 цифр, потому что there are many strange things совпавших по версии Юникода \d.

Смежные вопросы