Tengo una cadena de la siguiente manera:
theatre = 'Regal Crown Center Stadium 14'

Me gustaría dividir esto en un acrónimo basado en la primera letra de cada palabra, pero también incluir ambos números:
salida deseada = 'RCCS14'

Mi código intenta a continuación:
acronym = "" .join (palabra [0] para palabra en theatre.lower (). split ()) acrónimo = "" .join (palabra [0] .lower () para palabra en re.findall ("(\ w +)", teatro)) acrónimo = "" .join (palabra [0] .lower () para palabra en re.findall ("(\ w + | \ d {1,2})", teatro)) acrónimo = re.search (r "\ b (\ w + | \ d {1,2})", teatro)

En el que termino con algo como: rccs1 pero parece que no puedo capturar ese último número. También podría haber casos en los que el número esté en el medio del nombre: 'Regal Crown Center 14 Stadium' también. TIA!

3
Shwtm3 1 mar. 2018 a las 19:43

4 respuestas

La mejor respuesta

Ver expresiones regulares en uso aquí

(?:(?<=\s)|^)(?:[a-z]|\d+)
  • (?:(?<=\s)|^) Asegúrese de que lo que precede es un espacio o el inicio de la línea
  • (?:[a-z]|\d+) Coincide con una sola letra o uno o más dígitos

La bandera i (re.I en python) permite que [a-z] coincida con sus variantes en mayúsculas.

Ver código en uso aquí

import re

r = re.compile(r"(?:(?<=\s)|^)(?:[a-z]|\d+)", re.I)
s = 'Regal Crown Center Stadium 14'

print(''.join(r.findall(s)))

El código anterior encuentra todas las instancias donde la expresión regular coincide y une los elementos de la lista en una sola cadena.

Resultado: RCCS14

2
ctwheels 1 mar. 2018 a las 17:06

Puede usar re.sub() para eliminar todas las letras minúsculas y espacios.

Regex : [a-z ]+

Detalles:

  • []+ Coincide con un solo personaje presente en la lista entre uno y tiempos ilimitados

Código de Python :

re.sub(r'[a-z ]+', '', theatre)

Salida: RCCS14

Demostración de código

1
Srdjan M. 1 mar. 2018 a las 16:51

No puedo comentar ya que no tengo suficiente reputación, pero S. La respuesta de Jovan no es satisfactoria, ya que supone que cada palabra comienza con una letra mayúscula y que cada palabra tiene una sola letra mayúscula.

re.sub(r'[a-z ]+', '', "Regal Crown Center Stadium YB FIEUBFB DBUUFG FUEH  14")

Devolverá 'RCCSYBFIEUBFBDBUUFGFUEH14'

Sin embargo, las respuestas de ctwheels podrán funcionar en este caso:

r = re.compile(r"\b(?:[a-z]|\d+)", re.I)
s = 'Regal Crown Center Stadium YB FIEUBFB DBUUFG FUEH  14'

print(''.join(r.findall(s)))

Imprimirá

RCCSYFDF14
0
gcharbon 1 mar. 2018 a las 16:56
import re
theatre = 'Regal Crown Center Stadium 14'
r = re.findall("\s(\d+|\S)", ' '+theatre)
print(''.join(r))

Me da RCCS14

0
Amaro Vita 1 mar. 2018 a las 17:05