Atascado con el siguiente problema:

Tengo una cadena 'ABC.123.456XX' y quiero usar expresiones regulares para extraer los 3 caracteres numéricos que vienen después del segundo período. Realmente estoy luchando con esto y agradecería cualquier idea nueva, esto es lo más cercano que tengo, pero no está realmente cerca de lo que quiero:

'.*\.(.*?\.\d{3})'

Agradezco cualquier ayuda por adelantado, gracias.

3
spyridon 9 oct. 2019 a las 00:53

3 respuestas

La mejor respuesta

Esta expresión también podría funcionar bien:

[^\r\n.]+\.[^\r\n.]+\.([0-9]{3})

Prueba

import re

regex = r'[^\r\n.]+\.[^\r\n.]+\.([0-9]{3})'
string = '''
ABC.123.456XX
ABCOUOU.123123123.000871XX
ABCanything_else.123123123.111871XX
'''

print(re.findall(regex, string))

Salida

['456', '000', '111']

Si desea simplificar / modificar / explorar la expresión, se explica en el panel superior derecho de regex101. com. Si lo desea, también puede ver en este enlace, cómo coincidiría contra algunas entradas de muestra.


1
Emma 8 oct. 2019 a las 22:05

Si su entrada siempre estará en un formato similar, como xxx.xxx.xxxxx, entonces una solución es la manipulación de cadenas:

>>> s = 'ABC.123.456XX'
>>> '.'.join(s.split('.')[2:])[0:3]

Explicación

En la línea '.'.join(s.split('.')[2:])[0:3]:

  • s.split('.') divide la cadena en la lista ['ABC', '123', '456XX']
  • '.'.join(s.split('.')[2:]) se une al resto de la lista después del segundo elemento, por lo que '456XX'
  • [0:3] selecciona la subcadena del índice 0 al índice 2 (inclusive), por lo que el resultado es 456
2
wcarhart 8 oct. 2019 a las 22:08

Dot, no Dot dos veces, luego siguen los 3 dígitos en el grupo de captura 1

[^.]*(?:\.[^.]*){2}(\d{3})

https://regex101.com/r/qWpfHx/1

Expandida

 [^.]* 
 (?: \. [^.]* ){2}
 ( \d{3} )                     # (1)
2
x15 8 oct. 2019 a las 23:05
58294532