validar regulares python3 online expresiones ejemplos abder python regex overlapping

python - regulares - ¿Cómo encontrar coincidencias superpuestas con una expresión regular?



findall python re (3)

Excepto por la aserción de longitud cero, el carácter en la entrada siempre se consumirá en la coincidencia. Si alguna vez está en el caso en que desea capturar cierto carácter en la cadena de entrada más una vez, necesitará una aserción de longitud cero en la expresión regular.

Hay varias aserciones de longitud cero (por ej. ^ (Inicio de entrada / línea), $ (final de entrada / línea), /b (límite de palabra)), pero las miradas ( (?<=) Son positivas y (?=) look-ahead positivo) son la única forma en que puede capturar texto superpuesto de la entrada. Las miradas negativas ( (?<!) Look-behind negativo, (?!) Look-ahead negativo) no son muy útiles aquí: si son ciertas, entonces la captura adentro falló; si afirman que es falso, entonces la coincidencia falla. Estas aserciones son de longitud cero (como se mencionó anteriormente), lo que significa que afirmarán sin consumir los caracteres en la cadena de entrada. En realidad, coincidirán con la cadena vacía si la afirmación pasa.

Aplicando el conocimiento anterior, una expresión regular que funcione para su caso sería:

(?=(/w/w))

>>> match = re.findall(r''/w/w'', ''hello'') >>> print match [''he'', ''ll'']

Como / w / w significa dos caracteres, se esperan ''he'' y ''ll''. Pero, ¿por qué ''el'' y ''lo'' no coinciden con la expresión regular?

>>> match1 = re.findall(r''el'', ''hello'') >>> print match1 [''el''] >>>


Puede usar el nuevo módulo de expresión regular de Python , que admite coincidencias superpuestas.

>>> import regex as re >>> match = re.findall(r''/w/w'', ''hello'', overlapped=True) >>> print match [''he'', ''el'', ''ll'', ''lo'']


findall no produce coincidencias superpuestas por defecto. Esta expresión sin embargo:

>>> re.findall(r''(?=(/w/w))'', ''hello'') [''he'', ''el'', ''ll'', ''lo'']

Aquí (?=...) es una aserción de búsqueda anticipada :

(?=...) coincide si ... coincide con el siguiente, pero no consume ninguna cadena. Esto se llama una afirmación de anticipación. Por ejemplo, Isaac (?=Asimov) coincidirá con ''Isaac '' solo si es seguido por ''Asimov'' .