Python regex se potrivește cu operatorul OR (Programare, Python, Regex, String, Timp)

Mark Kennedy a intrebat.

Încerc să potrivesc formatele de timp în AM sau PM.

i.e. 02:40PM
     12:29AM 

Folosesc următorul regex

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

dar continuă să returneze doar AM PM șir de caractere fără numere. Ce se întâmplă în neregulă?

Comentarii

  • poate folosiți un grup de captură –  > Por Tommy.
  • @Tommy: Folosește un grup de captură; aceasta este cauza problemei. Când regex-ul are grupuri de captură, findall() le returnează doar pe acestea, nu și întreaga potrivire. –  > Por Alan Moore.
  • Atenție, ați putea, de asemenea, să evitați în întregime grupul, schimbând (AM|PM) în [AP]M. –  > Por ShadowRanger.
5 răspunsuri
hwnd

Utilizați un grup care nu captează (?: și trimitere la grupul de potrivire.

Utilizați re.I pentru o potrivire insensibilă la majuscule și minuscule.

import re

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

De asemenea, puteți utiliza re.findall() pentru potrivire recursivă.

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

A se vedea demo

user255555451

Utilizați un grup de captură nedelimitat (?:...):

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

De asemenea, puteți scurta Regex-ul dvs. la dd:dd(?:A|P)M.

porges

Se pare că accesezi grupul 1, când ar trebui să accesezi grupul 0.

Grupurile din regex-ul dvs. sunt următoarele:

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

Puteți accesa întregul meci prin:

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

Ashwini Chaudhary

Nu capturați câmpurile Ora, minut:

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

matt forsythe

Capturați din greșeală primul grup (ceea ce se potrivește cu porțiunea de model din paranteze) în loc de grupul „0st” (care reprezintă întreaga potrivire)?