2012-12-20 11 views
14

Ecco i casi. Sto cercando il seguente modello in un file di registro.Regex e l'operatore OR senza raggruppamento in Python?

Tutte le stringhe sono in forma di AB_N o CDE_N. AB e CDE sono lettere fisse, seguite da un trattino basso. N può essere 2 o 3 numeri.

Ho provato (AB|CDE)_\d{2,3} ma che restituisce un gruppo. Non posso fare \w{2,3}\d{2,3} perché deve essere o AB o CDE e non AC o FEG. Anche l'omissione delle parentesi si interrompe. Sono sicuro che la soluzione è semplice ma sono nuovo in Python e regex e non riesco a capirlo.

+0

si può avvolgere l'intera cosa in un gruppo: '((AB | CDE) _ \ d {2,3})', e il primo gruppo è 'AB_123' e il secondo è appena' AB'. –

risposta

28

A ?: all'interno di una parentesi in una regex lo rende non-acquisizione. In questo modo: (?:AB|CDE)_\d{2,3}

Vedere documenti qui: http://docs.python.org/3/library/re.html Circa un terzo del percorso passa sopra la sintassi non di acquisizione.

+0

questo è tutto! brillante ... grazie – pedram

3

La sintassi del gruppo non acquisibile è (?:...). Così fa (?:AB|CDE)_\d{2,3}. Questo è documented insieme a tutto il resto.

+0

questo non ha funzionato, ma utilizzando (? AB | CDE) ha fatto. – pedram

+2

Oops, un errore di battitura. Ma sembra che hai fatto uno troppo, dal momento che dovrebbe essere '? (: AB | CDE)'. – BrenBarn

+1

Posso fare qualcosa come '(?: Abc | def | ghi | xyz)'? – qed