2016-04-06 9 views
0

Lassen Sie uns sagen, dass ich eine Zeichenfolge, die wie folgt aussieht:Wie beide Gruppen extrahieren innerhalb einer wiederholten Regex in Python

my_date = February 4 - March 23, 2015

Ich möchte einen regulären Ausdruck erstellen, die sowohl Monatsnamen extrahieren und die Jahr, so dass ich es wie folgt auf:

date_regex = r"^(?:(Jan(?:uary)?|Feb(?:ruary)|Marc?h?|Apr[il1]?[I1l]?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:tober)?|Nov(?:ember)?|Dec(?:ember)?)\s+\d?\d(?:\s+-\s+)?){2},\s+(20[01]\d)" 

ich dachte, ich durch Einschließen der ganze Regex klug wurde den Monat und Tag in einer nicht passenden Gruppe und {2} sollte zwei sein, dort zu sagen, mit übereinstimmen sie, aber leider der gro ups, die ich davon bekomme, sind ("March", "2015"). Es scheint, als ob es nicht das erste Match von "Februar" fängt.

Wohin gehe ich falsch? Ist es meine Regex, oder ist das einfach nicht möglich?

This question scheint verwandt zu sein und scheint zu implizieren, dass was ich versuche zu tun ist nicht ohne das Modul regex möglich.

Dank

+0

Setzen Sie einen Capture Gruppiere ** um ** die Gruppe mit '{2}' danach. – Barmar

+0

Das gibt mir '(" 4. Februar - 23. März "," März "," 2015 ")'. Wie auch immer, um es genauer zu machen? – brittenb

+0

Wird das Jahr immer am Ende sein? – Druzion

Antwort

1

dieses RegEx Versuchen:

(Jan(?:uary)?|Feb(?:ruary)|Marc?h?|Apr[il1]?[I1l]?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:tober)?|Nov(?:ember)?|Dec(?:ember)?|20[01]\d) 

Sie zu kompliziert es. entweder Wählen Sie einfach einen Monat oder das Jahr (20[01]\d)

Live Demo on Regex101


Wie es funktioniert:

(
    Jan(?:uary)?|   # January 
    Feb(?:ruary)|   # February 
    Marc?h?|    # March 
    Apr[il1]?[I1l]?|  # April 
    May|     # May 
    June?|     # June 
    July?|     # July 
    Aug(?:ust)?|   # August 
    Sep(?:tember)?|  # September 
    Oct(?:tober)?|   # October 
    Nov(?:ember)?|   # November 
    Dec(?:ember)?|   # December 
    20[01]\d    # Year 
) 

Es entweder einen Monatsnamen oder ein Jahr auswählt. Ich bin mir nicht sicher, warum Sie Apr[il1]?[I1l]? für April verwendet haben. Verwenden Sie einfach Apr(il)? oder Apri?l?

+0

Das macht für mich Sinn, aber aus irgendeinem Grund gibt es '(" Februar ",)' Was könnte das verursachen? – brittenb

+0

@brittenb Verwenden Sie die 'g'lobal Flagge? Ihre RegEx würde die ganze Sache auf einmal zusammenbringen, so dass die globale Flagge nicht benötigt wird. Dies entspricht jedoch jedem Bit einzeln, also muss es verwendet werden. – Druzion

+0

Ich benutzte 're.search', aber das funktionierte nicht. Mit 're.findall' wurde das Problem behoben. Deine Antwort funktioniert so, wie ich es hoffe. Vielen Dank! – brittenb

0

Eine weitere allgemeinere Lösung, wenn Sie nur das Beispiel Zeichenfolge nicht also in einem großen Text, haben zu suchen:

my_date = "February 4 - March 23, 2015" 

ss = re.compile(r"[a-zA-Z]+\S|\d{4}") 

print ss.findall(my_date) 

Ausgang:

['February', 'March', '2015'] 
+0

Leider ist das Dokument, das ich analysiere, mehr als 500 Seiten und viele Werte würden dem entsprechen. – brittenb

Verwandte Themen