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.

Problema con la expresión regular para separar el “slug” (apodo) y el apellido en una lista.

Mi cadena es:

test_string = "@@@__slug1^^__firstname lastname@@@^^^ @@@__slug2^^__firstname1 lastname1@@@^^^"

Estoy intentando separar el slug y el apellido en una lista, mi resultado será así:

slug_list = [slug1,slug2]
name_list=[firstname lastname,firstname1 lastname1]

Intento buscar todos los slugs primero, mi código para hacerlo es:

import re
test_string = "@@@__slug1^^__firstname lastname@@@^^^ @@@__deletepurpose^^__Delete Purpose@@@^^^"
pattern = "@@@__\|(''*?)\|^^"
substring = re.search(pattern, test_string).group(1)
print(substring)

Pero no encuentra ninguna coincidencia, ya que me está dando el error AttributeError: 'NoneType' object has no attribute 'group'.

¿Qué hay de malo con el patrón que estoy usando?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El patrón que estás utilizando es incorrecto. El símbolo | no es un carácter especial válido para las expresiones regulares, y el símbolo * se está utilizando incorrectamente.

    Para encontrar todas las subcadenas que coincidan con el patrón @@@__<slug>^^__<nombre apellido="">@@@^^^, puedes utilizar el siguiente código:

    import re
    
    test_string = "@@@__slug1^^__nombre apellido@@@^^^ @@@__slug2^^__nombre1 apellido1@@@^^^"
    
    slug_pattern = r"@@@__(\w+)"
    
    slug_list = re.findall(slug_pattern, test_string)
    
    name_pattern = r"(?<=\^\^__)\w+\s\w+(?=@@@)"
    
    name_list = re.findall(name_pattern, test_string)
    
    print("Lista de slugs:", slug_list)
    print("Lista de nombres:", name_list)
    

    Salida:

    Lista de slugs: ['slug1', 'slug2']
    Lista de nombres: ['nombre apellido', 'nombre1 apellido1']
    

    Explicación:

    • slug_pattern busca cualquier carácter alfanumérico después de @@@__, que se captura en un grupo. Al utilizar re.findall(), se devolverán todas las coincidencias en la cadena.
    • name_pattern busca cualquier carácter alfanumérico separado por un espacio después de ^^__ y antes de @@@. Esto se hace utilizando retrocesos y avanzadas positivas. Al utilizar re.findall(), se devolverán todas las coincidencias en la cadena.
    • Luego, se imprime la salida con las dos listas.

Comments are closed.