es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo extraer un nombre humano de una cadena en Python.

Tengo una cadena fuera de una imagen OCR y necesito encontrar una forma de extraer nombres de personas de ella. Aquí está la imagen requerida para OCR, que se muestra así:

From: Al Amri, Salim <salim.amri@gmail.com>

<p>Sent: 25 August 2021 17:20</p>

<p>To: Al Harthi, Mohammed <mohd4.king@rihal.om></p>

<p>Ce: Al hajri, Malik <hajri990@ocaa.co.om>; Omar, Naif <nnnn49@apple.com></p>

<p>Subject: Conference Rooms Booking Details</p>

<p>Dear Mohammed,</p>

<p>As per our last discussion these are the available conference rooms available for booking along
with their rates for full day:</p>

<p>Room: Luban, available on 26/09/2021. Rate: $4540</p>

<p>Room: Mazoon, available on 04/12/2021 and 13/02/2022. Rate: $3000
Room: Dhofar. Available on 11/11/2021. Rate: $2500</p>

<p>Room: Nizwa. Available on 13/12/2022. Rate: $1200</p>

<p>Please let me know which ones you are interested so we go through more details.
Best regards,</p>

<p>Salim Al Amri
<code>
There are 4 names in total in the heading, and i am required to get the output:
</code>
names = 'Al Hajri, Malik', 'Omar, Naif', 'Al Amri, Salim', 'Al Harthy, Mohammed' #desired output
<code>
but I have no idea how to extract the names. I have tried RegEx and came up with:
</code>
names = re.findall(r'(?i)([A-Z][a-z]+[A-Z][a-z][, ] [A-Z][a-z]+)', string) #regex to find names
<code>
which searches for a Capital letter, then a comma, then another word starting with a capital letter. it is close to the desired result but it comes out as:
</code>
names = ['Amri, Salim', 'Harthi, Mohammed', 'hajri, Malik', 'Omar, Naif', 'Luban, available', 'Mazoon, available'] #acutal result

Se me ocurrió tal vez usar otra cadena que extraiga los nombres de las salas y los excluya de la lista, pero no tengo idea de cómo implementar esa idea. Soy nuevo en el uso de expresiones regulares, así que agradeceré cualquier ayuda. Gracias de antemano.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para extraer los nombres deseados del texto del OCR, podemos seguir el enfoque de identificar primero las direcciones de correo electrónico y luego extraer los nombres asociados con esas direcciones de correo electrónico. Una forma de lograr esto puede ser:

    1. Usar regex para encontrar todas las apariciones de direcciones de correo electrónico en el texto.
    2. Para cada dirección de correo electrónico encontrada, usar regex para encontrar el nombre asociado. Dado que el nombre generalmente se coloca antes de la dirección de correo electrónico y se separa por una coma, podemos buscar una secuencia de letras mayúsculas y minúsculas seguidas de una coma y luego la dirección de correo electrónico.
    3. Agregar los nombres encontrados a una lista y devolver la lista final.

    Aquí hay una implementación del enfoque anterior en Python:

    import re
    
    def extract_names(texto):
        email_regex = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'  # regex para encontrar direcciones de correo electrónico
        name_regex = r'([A-Z][a-z]+ [A-Z][a-z]+),'                          # regex para encontrar nombres antes de la dirección de correo electrónico
        nombres = []
        for email in re.findall(email_regex, texto):
            coincidencia = re.search(name_regex + email, texto)
            if coincidencia:
                nombres.append(coincidencia.group(1))
        return nombres
    

    Podemos probar esta función en el texto del OCR proporcionado:

    texto_ocr = """
    De: Al Amri, Salim <salim.amri@gmail.com>
    
    Enviado: 25 de agosto de 2021 17:20
    
    Para: Al Harthi, Mohammed <mohd4.king@rihal.om>
    
    Ce: Al hajri, Malik <hajri990@ocaa.co.om>; Omar, Naif <nnnn49@apple.com>
    
    Asunto: Detalles de reserva de salas de conferencias
    
    Estimado Mohammed,
    
    Según nuestra última discusión, estas son las salas de conferencias disponibles para reserva junto con sus tarifas para todo el día:
    
    Sala: Luban, disponible el 26/09/2021. Tarifa: $4540
    
    Sala: Mazoon, disponible el 04/12/2021 y 13/02/2022. Tarifa: $3000
    Sala: Dhofar. Disponible el 11/11/2021. Tarifa: $2500
    
    Sala: Nizwa. Disponible el 13/12/2022. Tarifa: $1200
    
    
    
    Por favor, avíseme cuáles le interesan para que podamos revisar más detalles.
    Atentamente,
    
    Salim Al Amri
    """
    
    nombres = extract_names(texto_ocr)
    print(nombres)  # Salida: ['Al Amri, Salim', 'Al Harthi, Mohammed', 'Al hajri, Malik', 'Omar, Naif']
    

    Como podemos ver, esta implementación extrae correctamente los cuatro nombres del texto del OCR. Hay que tener en cuenta que las direcciones de correo electrónico no se devuelven como parte de la salida.

Comments are closed.