patrón de expresión regular de Python * no funciona como se esperaba

Según la clase de Google Python en línea, encontré la siguiente documentación.

'*' – 0 o más apariciones del patrón a su izquierda

Pero, cuando intenté lo siguiente, no está dando el resultado esperado.

Estoy esperando 'iiiiiiiiiiiiii' como salida. Pero está dando '' como salida.

¿Puedo saber la razón por favor?

 re.search(r'i*','biiiiiiiiiiiiiig').group() 

* significa 0 o más, pero re.search devolvería solo la primera coincidencia. Aquí el primer partido es una cadena vacía. Así que obtienes una cadena vacía como salida.

Cambie * a + para obtener la salida deseada.

 >>> re.search(r'i*','biiiiiiiiiiiiiig').group() '' >>> re.search(r'i+','biiiiiiiiiiiiiig').group() 'iiiiiiiiiiiiii' 

Considera este ejemplo.

 >>> re.search(r'i*','biiiiiiiiiiiiiig').group() '' >>> re.search(r'i*','iiiiiiiiiiiiiig').group() 'iiiiiiiiiiiiii' 

Aquí i* devuelve iiiiiiiiiiiiii porque al principio, el motor de expresiones regulares intenta coincidir con cero o más veces de i . Una vez que encuentra i en el primer momento, combina con avidez todas las i ‘s como en el segundo ejemplo, por lo que obtiene iiiiiiii como salida y si i no está en el primero ( considere esta cadena biiiiiiig ), el patrón i* coincidirá toda la cadena vacía antes de cada no coincidencia, en nuestro caso, coincide con todas las cadenas vacías que existen antes de b y g . Debido a que re.search solo devuelve la primera coincidencia, debe obtener una cadena vacía debido a la no coincidencia b en la primera.

¿Por qué tengo tres cadenas vacías como salida en el siguiente ejemplo?

 >>> re.findall(r'i*','biiiiiiiiiiiiiig') ['', 'iiiiiiiiiiiiii', '', ''] 

Como expliqué anteriormente, por cada no coincidencia debe obtener una cadena vacía como coincidencia. Dejame explicar. El motor Regex analiza la entrada de izquierda a derecha.

  1. La primera cadena vacía como salida se debe a que el patrón i* no coincidirá con el carácter b sino que coincidirá con la cadena vacía que existe antes de la b .

  2. Ahora el motor se mueve al siguiente carácter que es i que coincidiría con nuestro patrón i* , por lo que coincide con la siguiente i ‘s. Así que obtienes iiiiiiiiiiiiii como el segundo.

  3. Después de hacer coincidir todas las i , se mueve al siguiente carácter que es g que no coincide con nuestro patrón i* . Entonces i* coincide con la cadena vacía antes de la no coincidencia g . Esa es la razón de la tercera cadena vacía.

  4. Ahora nuestro patrón i* coincide con la cadena vacía que existe antes del final de la línea. Esa es la razón de la cuarta cuerda vacía.

prueba esto

 re.search(r'i+','biiiiiiiiiiiiiig').group() 

Espero eso ayude.

Actualizar:

Parece que entendí mal la pregunta. T_T