web-dev-qa-db-fra.com

répéter plusieurs caractères regex

Existe-t-il un moyen d'utiliser une expression régulière pour faire correspondre un jeu de caractères répété? Par exemple:

ABCABCABCABCABC

ABC{5}

Je sais que c'est faux. Mais y a-t-il quelque chose pour correspondre à cet effet?

Mettre à jour:

Pouvez-vous utiliser des groupes de capture imbriqués? Donc quelque chose comme (?<cap>(ABC){5})?

18
Falmarri

Mettez la regex que vous voulez répéter entre parenthèses. Par exemple, si vous voulez 5 répétitions de ABC:

(ABC){5}

Ou si vous voulez un nombre quelconque de répétitions (0 ou plus):

(ABC)*

Ou une ou plusieurs répétitions:

(ABC)+

edit pour répondre à la mise à jour

Les parenthèses dans les expressions régulières font deux choses; ils regroupent une séquence d'éléments dans une expression régulière, de sorte que vous puissiez appliquer un opérateur à une séquence entière au lieu du dernier élément uniquement, et ils capturent le contenu de ce groupe afin que vous puissiez extraire la sous-chaîne correspondant à cette sous-expression. dans la regex.

Vous pouvez imbriquer des parenthèses; ils sont comptés à partir du premier paren d'ouverture. Par exemple:

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

Si vous souhaitez éviter de capturer lorsque vous groupez, vous pouvez utiliser (?:. Cela peut être utile si vous ne souhaitez pas que les parenthèses que vous utilisez simplement regroupent une séquence dans le but d'appliquer un opérateur pour modifier la numérotation de vos correspondances. C'est aussi plus rapide.

>>> re.search('[0-9]* (?:ABC(...))', '123 ABCDEF 456').group(1)
'DEF'

Donc, pour répondre à votre mise à jour, vous pouvez utiliser des groupes de capture imbriqués, voire même éviter de capturer avec le groupe interne:

>>> re.search('((?:ABC){5})(DEF)', 'ABCABCABCABCABCDEF').group(1)
'ABCABCABCABCABC'
>>> re.search('((?:ABC){5})(DEF)', 'ABCABCABCABCABCDEF').group(2)
'DEF'
37
Brian Campbell

(ABC){5} devrait travailler pour vous

3
Novikov

ABC {5} correspond à ABCCCCC. Pour faire correspondre 5 ABC, vous devez utiliser (ABC) {5}. Les parenthèses permettent de regrouper un ensemble de caractères. Vous pouvez également définir un intervalle pour les occurrences, tel que (ABC) {3,5}, qui correspond à ABCABCABC, ABCABCABCABC et ABCABCABCABCABC. 

(ABC) {1,} signifie 1 ou plusieurs répétitions qui sont exactement les mêmes que (ABC) +.

(ABC) {0,} signifie 0 ou plusieurs répétitions qui sont exactement les mêmes que (ABC) *.

3
Zafer

Les parenthèses "()" permettent de regrouper des caractères et des expressions dans des expressions régulières plus grandes et plus complexes. Les quantificateurs qui suivent immédiatement le groupe s’appliquent à l’ensemble du groupe.

(ABC){5}
1
pyfunc

Quant à la mise à jour de la question-

Vous pouvez imbriquer des groupes de capture. L'index du groupe de capture est incrémenté par paren ouvert.

(((ABC)*)(DEF)*)

En alimentant cette regex ABCABCABCDEFDEFDEF, le groupe de capture 0 correspond au tout, 1 correspond au tout, 2 à ABCABCABC, 3 à ABC et 4 à DEF (car l'étoile est en dehors du groupe de capture).

Si vous avez des variations à l'intérieur d'un groupe de capture et une répétition juste à l'extérieur, les choses peuvent devenir un peu sournoises si vous ne vous y attendez pas ...

(a[bc]*c)*

une fois alimenté, abbbcccabbc renverra la correspondance last en tant que groupe de capture 1, dans cet exemple uniquement abbc, étant donné que le groupe de capture est réinitialisé avec l'opérateur de répétition.

0
dash-tom-bang