Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

222
Visualizações
Python divide la cadena por múltiples delimitadores siguiendo una jerarquía

Quiero dividir cadenas solo una vez en función de múltiples delimitadores como "y", "&" y "-" en ese orden. Ejemplo:

 '121 34 adsfd' -> ['121 34 adsfd'] 'dsfsd and adfd' -> ['dsfsd ', ' adfd'] 'dsfsd & adfd' -> ['dsfsd ', ' adfd'] 'dsfsd - adfd' -> ['dsfsd ', ' adfd'] 'dsfsd and adfd and adsfa' -> ['dsfsd ', ' adfd and adsfa'] 'dsfsd and adfd - adsfa' -> ['dsfsd ', ' adfd - adsfa'] 'dsfsd - adfd and adsfa' -> ['dsfsd - adfd ', ' adsfa']

Intenté el siguiente código para lograr esto:

 import re re.split('and|&|-', string, maxsplit=1)

Funciona para todos los casos excepto el último. Como no sigue la jerarquía, para la última devuelve:

 'dsfsd - adfd and adsfa' -> ['dsfsd ', ' adfd and adsfa']

¿Cómo puedo conseguir esto?

over 4 years ago · Hanz Gallego
3 Respostas
Responde à pergunta

0

Esto no sería práctico con una sola expresión regular. Podría hacer que funcione con miradas negativas hacia atrás, pero se complicaría bastante con cada delimitador adicional. Es bastante trivial hacer esto con str.split() simple y antiguo y varias líneas. Todo lo que tiene que hacer es verificar si dividir con el delimitador actual le da dos elementos. Si es así, esa es tu respuesta. Si no, pase al siguiente delimitador:

 def split_new(inp, delims): for d in delims: result = inp.split(d, maxsplit=1) if len(result) == 2: return result return [inp] # If nothing worked, return the input

Para probar esto:

 teststrs = ['121 34 adsfd' , 'dsfsd and adfd', 'dsfsd & adfd' , 'dsfsd - adfd' , 'dsfsd and adfd and adsfa' , 'dsfsd and adfd - adsfa' , 'dsfsd - adfd and adsfa' ] for t in teststrs: print(repr(t), '->', split_new(t, ['and', '&', '-']))

salidas

 '121 34 adsfd' -> ['121 34 adsfd'] 'dsfsd and adfd' -> ['dsfsd ', ' adfd'] 'dsfsd & adfd' -> ['dsfsd ', ' adfd'] 'dsfsd - adfd' -> ['dsfsd ', ' adfd'] 'dsfsd and adfd and adsfa' -> ['dsfsd ', ' adfd and adsfa'] 'dsfsd and adfd - adsfa' -> ['dsfsd ', ' adfd - adsfa'] 'dsfsd - adfd and adsfa' -> ['dsfsd - adfd ', ' adsfa']
over 4 years ago · Hanz Gallego Relatório

0

Tratar:

 import re tests = [ ["121 34 adsfd", ["121 34 adsfd"]], ["dsfsd and adfd", ["dsfsd ", " adfd"]], ["dsfsd & adfd", ["dsfsd ", " adfd"]], ["dsfsd - adfd", ["dsfsd ", " adfd"]], ["dsfsd and adfd and adsfa", ["dsfsd ", " adfd and adsfa"]], ["dsfsd and adfd - adsfa", ["dsfsd ", " adfd - adsfa"]], ["dsfsd - adfd and adsfa", ["dsfsd - adfd ", " adsfa"]], ] for s, result in tests: res = re.split(r"and|&(?!.*and)|-(?!.*and|.*&)", s, maxsplit=1) print(res) assert res == result

Huellas dactilares:

 ['121 34 adsfd'] ['dsfsd ', ' adfd'] ['dsfsd ', ' adfd'] ['dsfsd ', ' adfd'] ['dsfsd ', ' adfd and adsfa'] ['dsfsd ', ' adfd - adsfa'] ['dsfsd - adfd ', ' adsfa']

Explicación:

La expresión regular and|&(?!.*and)|-(?!.*and|.*&) utiliza 3 alternativas.

  1. Hacemos coincidir and siempre o:
  2. Hacemos coincidir & solo si no hay and adelante (usando la anticipación negativa (?! ) o:
  3. Hacemos coincidir - solo si no hay and or & adelante.

Estamos usando este patrón en re.sub -> dividir solo en la primera coincidencia.

over 4 years ago · Hanz Gallego Relatório

0

Puede mantener una lista de los delimitadores, ordenados por su valor. Luego, puede combinar re.split con re.findall para usar solo los delimitadores producidos a partir de este último que son los menos valiosos en la división, según la clasificación en ops :

 import re def split_order(s): r, ops = re.findall('(?<=\s)and(?=\s)|\&|\-', s), ['and', '&', '-'] m = -1 if not r else min([ops.index(i) for i in r]) a, *b = re.split('|'.join(l:=[i for i in r if ops.index(i) == m]), s) return [s] if not l else ([a] if not b else [a, s[len(a)+len(l[0]):]]) vals = ['121 34 adsfd' , 'dsfsd and adfd', 'dsfsd & adfd' , 'dsfsd - adfd' , 'dsfsd and adfd and adsfa' , 'dsfsd and adfd - adsfa' , 'dsfsd - adfd and adsfa' ] for i in vals: print(split_order(i))

Producción:

 ['121 34 adsfd'] ['dsfsd ', ' adfd'] ['dsfsd ', ' adfd'] ['dsfsd ', ' adfd'] ['dsfsd ', ' adfd and adsfa'] ['dsfsd ', ' adfd - adsfa'] ['dsfsd - adfd ', ' adsfa']
over 4 years ago · Hanz Gallego Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda