Racchiudere l'espressione regolare che si desidera ripetere tra parentesi. Per esempio, se si vuole 5 ripetizioni di ABC
:
(ABC){5}
Oppure, se volete un qualsiasi numero di ripetizioni (0 o più):
(ABC)*
o uno o più ripetizioni:
(ABC)+
modifica per rispondere all'aggiornamento
Le parentesi nelle espressioni regolari fanno due cose; si raggruppano una sequenza di elementi in un'espressione regolare, in modo che è possibile applicare un operatore per un'intera sequenza invece che solo l'ultima voce, e catturare i contenuti di quel gruppo in modo da poter estrarre la sottostringa che corrispondeva con quella sottoespressione nella regex.
Puoi parentesi nido; sono contati dal primo paren di apertura. Per esempio:
>>> re.search('[0-9]* (ABC(...))', '123 ABCDEF 456').group(0)
'123 ABCDEF'
>>> re.search('[0-9]* (ABC(...))', '123 ABCDEF 456').group(1)
'ABCDEF'
>>> re.search('[0-9]* (ABC(...))', '123 ABCDEF 456').group(2)
'DEF'
Se volete evitare la cattura quando si esegue il raggruppamento, è possibile utilizzare (?:
. Questo può essere utile se non si desidera parentesi che si sta solo usando per raggruppare una sequenza allo scopo di applicare un operatore per cambiare la numerazione delle tue partite. È anche più veloce.
>>> re.search('[0-9]* (?:ABC(...))', '123 ABCDEF 456').group(1)
'DEF'
Quindi per rispondere alla tua aggiornamento, sì, è possibile utilizzare i gruppi di cattura nidificati, o addirittura evitare la cattura con il gruppo interno a tutti:
>>> re.search('((?:ABC){5})(DEF)', 'ABCABCABCABCABCDEF').group(1)
'ABCABCABCABCABC'
>>> re.search('((?:ABC){5})(DEF)', 'ABCABCABCABCABCDEF').group(2)
'DEF'
fonte
2010-09-02 20:32:11
Vorrei usare + qui anziché *, perché * corrisponderà a 0 occorrenze di (ABC). – Robusto
(ABC) {3,5} anche per una serie di ripetizioni –
Oh duh. Stavo pensando() è usato solo per quella roba di cattura per qualche ragione. Ma questo ha un senso. Scelto per essere il primo – Falmarri