Obtener el número presente después de un patrón particular de una cadena coincidente en Python

Quiero obtener todos los números coincidentes (solo números de ejemplo ‘0012-22’) o números que contengan algún texto (ejemplo ‘RF332’) correspondiente que coincida con una lista de cadenas proporcionadas (“my_list” en el código) . El formato en el que estará presente el texto con número es como separado por un espacio o dos. Proporcionar un archivo de entrada de muestra para referencia.

Este es el archivo de entrada:

$cat input_file some text before Expedien: 1-21-212-16-26 some random text Reference RE9833 of all sentences. abc 123 456 something blah blah Ref.: tramite 1234567 Ref.: some junk Expedien N° 18-00777 # some new content some text Expedien N°18-0022995 # some garbled content 

El script hasta ahora se adjunta a continuación: Actualmente solo identifica un elemento que es {‘tramite’: ‘1234567’}

 import re import glob import os my_list = ['Ref.:', 'Reference', 'tramite', 'Expediente', 'Expediente No', 'Expedien N°', 'Exp.No', 'Expedien'] #open the file as input with open('garb.txt','r') as infile: res = dict() for line in infile: elems = re.split('(?::)?\s+', line) #print(elems) if len(elems) >= 2 : contains = False tmp = '' for elem in elems: if contains: res.update({tmp : elem}) print(res) contains = False break if elem in my_list: contains = True tmp = elem #print(res) 

Este es el resultado esperado:

Salida de muestra:

 {'Expedien N°': '18-0022995'} {'Expedien N°': '18-0022995'} {'Expedien': '1-21-212-16-26'} {'Reference' : 'RE9833'} 

etcétera etcétera.

Puedes utilizar

 (? 

Vea la demostración de expresiones regulares .

Detalles del patrón

  • (? - límite de la palabra izquierda (no ambiguo, \b significa que depende del contexto y si el siguiente carácter es un carácter que no es de la palabra, se requerirá un carácter de la palabra a la izquierda, y eso no es algo que los usuarios suelen esperar )
  • (your|escaped|keywords|here) - Captura del grupo 1: su lista de palabras clave, se puede crear fácilmente usando '|'.join(map(re.escape,my_list)) (tenga en cuenta que re.escape es necesario para escapar de la especial metacaracteres de expresiones regulares como . , + , ( , [ , etc.)
  • \W* - 0+ caracteres sin palabras (caracteres que no sean letras, dígitos o _ )
  • ([AZ]*\d+(?:-+[AZ]*\d+)*) - Grupo de captura 2:
    • [AZ]* - cero o más letras ASCII mayúsculas
    • \d+ - 1 o más dígitos
    • (?:-+[AZ]*\d+)* - 0 o más repeticiones de
      • -+ - uno o más guiones
      • [AZ]*\d+ - cero o más letras ASCII mayúsculas, 1 o más dígitos

Vea la demostración de Python :

 import re s="""your_text_here""" my_list = ['Ref.:', 'Reference', 'tramite', 'Expediente', 'Expediente No', 'Expedien N°', 'Exp.No', 'Expedien'] rx = r'(? 

Salida:

 [('Expedien', '1-21-212-16-26'), ('Reference', 'RE9833'), ('tramite', '1234567'), ('Expedien N°', '18-00777'), ('Expedien N°', '18-0022995')] 

Realmente debe haber algo que permita a los usuarios con menos de 50 puntos de repetición para comentar, porque este hilo es uno de los que realmente tengo curiosidad y quiero descifrar, pero no quería tener que dar una respuesta completa. en, porque la respuesta que estoy dando involucra situaciones finitas y no es flexible.

@Wiktor Stribiżew

Su solución pierde el “Ref.” Parte de la salida basada en su demo. Parece que quiere saltar “tramite”

@mate

En la salida que desees, debes editarla porque “UV1234” no aparece en ninguna parte de la cadena que publicaste

.

De todos modos, encontré una solución pero realmente espero que alguien pueda mejorar esto.

 >>> import re >>> string = '''some text before Expedien: 1-21-212-16-26 some random text Reference RE9833 of all sentences. abc 123 456 something blah blah Ref.: tramite 1234567 Ref.: some junk Expedien N° 18-00777 # some new content some text Expedien N°18-0022995 # some garbled content''' >>> re.findall('(?:(Expedien[\s]+N\S|Ref\.(?!:[\S\s]{,11}Expedien)|Reference|Expedien))[\S\s]*?([AZ\-]*(?:[\d]+)[\S]*)', string) [('Expedien', '1-21-212-16-26'), ('Reference', 'RE9833'), ('Ref.', '1234567'), ('Expedien N\xb0', '18-00777'), ('Expedien N\xb0', '18-0022995')] 

Las fallas:

  • Para capturar correctamente, se basa en parte en “Ref. (?!: [\ S \ s] {, 11} Expedien)”
  • En primer lugar, se debe editar “11” para tener en cuenta otras longitudes de información que pueden estar presentes, por lo que no es flexible
  • En segundo lugar, si es seguido por “Referencia” en lugar de la tercera “Ref.” será capturado incorrectamente