Python regex match или оператор
Я пытаюсь соответствовать форматам времени в AM или PM.
i.e. 02:40PM
12:29AM
Я использую следующее регулярное выражение
timePattern = re.compile('d{2}:d{2}(AM|PM)')
но он продолжает возвращаться только AM
PM
строка без чисел. Что случилось?
5 ответов
использовать группу без захвата (?:
и ссылка на группу совпадений.
использовать re.I
для нечувствительность к регистру сопоставление.
import re
def find_t(text):
return re.search(r'\d{2}:\d{2}(?:am|pm)', text, re.I).group()
вы также можете использовать re.findall()
для рекурсивного сопоставления.
def find_t(text):
return re.findall(r'\d{2}:\d{2}(?:am|pm)', text, re.I)
посмотреть demo
используйте группу захвата без разделителей (?:...)
:
>>> from re import findall
>>> mystr = """
... 02:40PM
... 12:29AM
... """
>>> findall("\d{2}:\d{2}(?:AM|PM)", mystr)
['02:40PM', '12:29AM']
>>>
кроме того, вы можете сократить регулярное выражение до \d\d:\d\d(?:A|P)M
.
похоже, что вы получаете доступ к группе 1, когда вам нужно получить доступ к группе 0.
группы в вашем регулярном выражении следующие:
\d{2}:\d{2}(AM|PM)
|-----| - group 1
|----------------| - group 0 (always the match of the entire pattern)
вы можете получить доступ ко всему матчу через:
timePattern.match('02:40PM').group(0)
вы не захватываете часовые, минутные поля:
>>> import re
>>> r = re.compile('(\d{2}:\d{2}(?:AM|PM))')
>>> r.search('02:40PM').group()
'02:40PM'
>>> r.search('Time is 12:29AM').group()
'12:29AM'
вы случайно захватываете 1-й кластер (материал, который соответствует части шаблона в круглых скобках) вместо кластера "0st" (который является целым совпадением)?