ti-enxame.com

repetindo vários caracteres regex

Existe uma maneira de usar um regex para corresponder a um conjunto repetido de caracteres? Por exemplo:

ABCABCABCABCABCname__

ABC{5}

Eu sei que está errado. Mas há algo que corresponda a esse efeito?

Atualizar:

Você pode usar grupos de captura aninhados? Então, algo como (?<cap>(ABC){5})?

18
Falmarri

Coloque o regex que você deseja repetir entre parênteses. Por exemplo, se você quiser 5 repetições de ABC:

(ABC){5}

Ou se você quiser qualquer número de repetições (0 ou mais):

(ABC)*

Ou uma ou mais repetições:

(ABC)+

edit para responder a atualização

Parênteses em expressões regulares fazem duas coisas; eles agrupam uma sequência de itens em uma expressão regular, para que você possa aplicar um operador a uma sequência inteira em vez de apenas ao último, e eles capturam o conteúdo desse grupo para que você possa extrair a substring correspondida por essa subexpressão na regex.

Você pode aninhar parênteses; eles são contados a partir do primeiro parêntese de abertura. Por exemplo:

>>> 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 você quiser evitar a captura quando estiver agrupando, use (?:. Isso pode ser útil se você não quiser que os parênteses que você está usando apenas agrupem uma sequência com o objetivo de aplicar um operador para alterar a numeração de suas correspondências. Também é mais rápido.

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

Portanto, para responder à sua atualização, sim, você pode usar grupos de captura aninhados ou até evitar a captura com o grupo interno:

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

(ABC){5} deve funcionar para você

3
Novikov

ABC {5} corresponde a ABCCCCC. Para combinar 5 ABC's, você deve usar (ABC) {5}. Parênteses são usados ​​para agrupar um conjunto de caracteres. Você também pode definir um intervalo para ocorrências como (ABC) {3,5} que corresponda a ABCABCABC, ABCABCABCABC e ABCABCABCABCABC.

(ABC) {1,} significa 1 ou mais repetição, que é exatamente igual a (ABC) +.

(ABC) {0,} significa 0 ou mais repetições, que é exatamente igual a (ABC) *.

3
Zafer

Parênteses "()" são usados ​​para agrupar caracteres e expressões em expressões regulares maiores e mais complexas. Quantificadores que seguem imediatamente o grupo aplicam-se a todo o grupo.

(ABC){5}
1
pyfunc

Quanto à atualização das questões

Você pode aninhar grupos de captura. O índice do grupo de captura é incrementado por parêntese aberto.

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

Alimentando o regex ABCABCABCDEFDEFDEF, o grupo de captura 0 corresponde à coisa toda, 1 também é a coisa toda, 2 é ABCABCABC, 3 é ABC e 4 é DEF (porque a estrela está fora do grupo de captura).

Se você tem variação dentro de um grupo de captura e uma repetição do lado de fora, então as coisas podem ficar um pouco complicadas se você não estiver esperando por isso ...

(a[bc]*c)*

quando alimentado, o abbbcccabbc retornará a correspondência last como grupo de captura 1, neste exemplo apenas o abbc, já que o grupo de captura é reconfigurado com o operador repeat.

0
dash-tom-bang