2010-09-02 17 views
14

¿Hay alguna manera de usar una expresión regular para que coincida con un conjunto repetitivo de caracteres? Por ejemplo:repitiendo varios caracteres regex

ABCABCABCABCABC

ABC{5}

Sé que está mal. Pero, ¿hay algo que coincida con ese efecto?

Actualizar:

¿Se puede utilizar anidado grupos de captura? ¿Algo así como (?<cap>(ABC){5})?

Respuesta

34

Adjunte la expresión regular que desea repetir entre paréntesis. Por ejemplo, si desea 5 repeticiones de ABC:

(ABC){5} 

O si desea cualquier número de repeticiones (0 o más):

(ABC)* 

o una o más repeticiones:

(ABC)+ 

editar para responder a la actualización

Los paréntesis en expresiones regulares hacen dos cosas; agrupan una secuencia de elementos en una expresión regular, de modo que puede aplicar un operador a una secuencia completa en lugar de solo el último elemento, y capturan el contenido de ese grupo para que pueda extraer la subcadena que coincidió con esa subexpresión en la expresión regular

Puede anidar paréntesis; se cuentan desde la primera apertura paren. Por ejemplo:

>>> 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 desea evitar la captura cuando se está agrupando, puede utilizar (?:. Esto puede ser útil si no desea paréntesis que esté utilizando para agrupar una secuencia con el fin de aplicar un operador para cambiar la numeración de sus coincidencias. También es más rápido.

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

Así que para responder a su actualización, sí, se puede utilizar grupos de captura anidados, o incluso evitar la captura con el grupo interno en absoluto:

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

Usaría + aquí en lugar de *, porque * coincidirá con 0 apariciones de (ABC). – Robusto

+4

(ABC) {3,5} también para una gama de repeticiones –

+0

Oh duh. Pensaba que() solo se usa para esa captura por alguna razón. Pero eso tiene sentido. Elegido por ser el primero – Falmarri

3

(ABC){5} debe trabajar para usted

1

Paréntesis "()" se usan para agrupar caracteres y expresiones dentro de expresiones regulares más grandes y complejas. Los cuantificadores que siguen inmediatamente al grupo se aplican a todo el grupo.

(ABC){5} 
3

ABC {5} corresponde a ABCCCCC. Para que coincida con 5 ABC, debe usar (ABC) {5}. Los paréntesis se utilizan para agrupar un conjunto de caracteres. También puede establecer un intervalo para las ocurrencias como (ABC) {3,5} que coincide con ABCABCABC, ABCABCABCABC y ABCABCABCABCABC.

(ABC) {1,} significa 1 o más repeticiones que es exactamente lo mismo que (ABC) +.

(ABC) {0,} significa 0 o más repeticiones que es exactamente lo mismo que (ABC) *.

0

En cuanto a la actualización de la pregunta-

puede anidar grupos de captura. El índice de grupo de captura se incrementa por abierto paren.

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

alimentación que regex ABCABCABCDEFDEFDEF, grupo de captura 0 partidos todo el asunto, 1 es también todo el asunto, 2 es ABCABCABC, 3 es ABC, y 4 es DEF (porque la estrella se encuentra fuera del grupo de captura) .

Si tiene variación dentro de un grupo de captura y una repetición a las afueras, entonces las cosas pueden ser un poco torcidas si no lo esperas ...

(a[bc]*c)* 

cuando abbbcccabbc alimentado devolverá el último coinciden como el grupo de captura 1, en este ejemplo solo el abbc, ya que el grupo de captura se restablece con el operador de repetición.

Cuestiones relacionadas