Python regex match O operador

Estoy tratando de hacer coincidir los formatos de hora en AM o PM.

ie 02:40PM 12:29AM 

Estoy usando el siguiente regex

 timePattern = re.compile('\d{2}:\d{2}(AM|PM)') 

pero sigue devolviendo solo AM cadena AM PM sin los números. ¿Qué va mal?

Utilice un grupo que no capture (?: Y haga referencia al grupo de coincidencia).

Utilice re.I para el emparejamiento insensible al caso.

 import re def find_t(text): return re.search(r'\d{2}:\d{2}(?:am|pm)', text, re.I).group() 

También puede usar re.findall() para la coincidencia recursiva.

 def find_t(text): return re.findall(r'\d{2}:\d{2}(?:am|pm)', text, re.I) 

Ver demo

Utilice un grupo de captura no delimitado (?:...) :

 >>> from re import findall >>> mystr = """ ... 02:40PM ... 12:29AM ... """ >>> findall("\d{2}:\d{2}(?:AM|PM)", mystr) ['02:40PM', '12:29AM'] >>> 

Además, puede acortar su Regex a \d\d:\d\d(?:A|P)M

Parece que estás accediendo al grupo 1, cuando necesitas acceder al grupo 0.

Los grupos en su expresión regular son los siguientes:

 \d{2}:\d{2}(AM|PM) |-----| - group 1 |----------------| - group 0 (always the match of the entire pattern) 

Puedes acceder a todo el partido a través de:

 timePattern.match('02:40PM').group(0) 

No estás capturando los campos de Hora, minutos:

 >>> 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' 

¿Está agarrando accidentalmente el primer grupo (las cosas que coinciden con la parte del patrón entre paréntesis) en lugar del grupo “0st” (que es la coincidencia completa)?