Expresión regular de Python; reemplazando una parte del partido

¿Cómo limitaría la coincidencia / reemplazo de los ceros iniciales en e004_n07? Sin embargo, si alguno de los dos términos contiene todos los ceros, entonces necesito conservar un cero en el término (vea el ejemplo a continuación). Para la cadena de entrada, siempre habrá 3 dígitos en el primer valor y 2 dígitos en el segundo valor.

Ejemplo de entrada y salida

e004_n07 #e4_n7 e020_n50 #e20_n50 e000_n00 #e0_n0 

¿Se puede lograr esto solo con re.sub, o necesito usar re.search/re.match?

Si solo quieres eliminar los ceros después de las letras, puedes usar:

 ([a-zA-Z])0+ 

Reemplazar con \1 referencia inversa. Vea la demostración de expresiones regulares .

El ([a-zA-Z]) capturará una letra y 0+ coincidirá con 1 o más ceros.

Demo de Python :

 import re s = 'e004_n07' res = re.sub(r'([a-zA-Z])0+', r'\1', s) print(res) 

Tenga en cuenta que re.sub encontrará y reemplazará todas las coincidencias no superpuestas (realizará una búsqueda y reemplazo global). Si no hay coincidencia, la cadena se devolverá tal como está, sin modificaciones. Por lo tanto, no es necesario utilizar re.match / re.search .

UDPATE

Para mantener 1 cero si los números solo contienen ceros, puede usar

 import re s = ['e004_n07','e000_n00'] res = [re.sub(r'(?<=[a-zA-Z])0+(\d*)', lambda m: m.group(1) if m.group(1) else '0', x) for x in s] print(res) 

Ver la demo de Python

Aquí, r'(?<=[a-zA-Z])0+(\d*)' regex coincide con uno o más ceros ( 0+ ) que están después de una letra ASCII ( (?<=[a-zA-Z]) ) y luego cualquier otro dígito (0 o más) se captura en el Grupo 1 con (\d*) . Luego, en el reemplazo, verificamos si el Grupo 1 está vacío, y si está vacío, insertamos 0 (solo hay ceros), de lo contrario, insertamos los contenidos del Grupo 1 (los dígitos restantes después de los primeros ceros a la izquierda).

No hay necesidad de usar re.sub si su reemplazo es tan simple, simplemente use str.replace :

 s = 'e004_n07' s.replace('0', '') # => 'e4_n7' 

Si su requisito es que DEBE usar regex , a continuación se muestra su patrón de expresiones regulares:

 >>> import re >>> s = 'e004_n07' >>> line = re.sub(r"0", "", s) >>> line 'e4_n7' 

Sin embargo, se recomienda no usar expresiones regulares cuando hay otra forma eficiente de realizar la misma operación, es decir, usar la función de replace

 >>> line = s.replace('0', '') >>> line 'e4_n7' 

Edición: No permita que nadie lo convenza de validar el formato de los datos fijos. Si eso es lo que necesita, no se conforme con algo demasiado simple.

No es muy bonito, pero en una situación que parece solucionada, puedes simplemente
establece todas las permutaciones, luego captura ciegamente las partes buenas,
omitir el cero y luego sustituirlo todo de nuevo.

Encuentre ([az])(?:([1-9][0-9][0-9])|0([1-9][0-9])|00([1-9]))(_[az])(?:([1-9][0-9])|0([1-9]))

Reemplace $1$2$3$4$5$6$7

Expandido

  ( [az] ) # (1) (?: ( [1-9] [0-9] [0-9] ) # (2) | 0 ( [1-9] [0-9] ) # (3) | 00 ( [1-9] ) # (4) ) ( _ [az] ) # (5) (?: ( [1-9] [0-9] ) # (6) | 0 ( [1-9] ) # (7) ) 

Salida

  ** Grp 0 - ( pos 0 , len 8 ) e004_n07 ** Grp 1 - ( pos 0 , len 1 ) e ** Grp 2 - NULL ** Grp 3 - NULL ** Grp 4 - ( pos 3 , len 1 ) 4 ** Grp 5 - ( pos 4 , len 2 ) _n ** Grp 6 - NULL ** Grp 7 - ( pos 7 , len 1 ) 7