¿Cuál es la forma pitónica de dividir una cadena antes de que ocurra un conjunto de caracteres determinado?
Por ejemplo, quiero dividir
'TheLongAndWindingRoad'
en cualquier aparición de una letra mayúscula (posiblemente excepto la primera) y obtener
['The', 'Long', 'And', 'Winding', 'Road']
.
Editar: También debería dividir ocurrencias individuales, es decir, de las 'ABC'
que me gustaría obtener
['A', 'B', 'C']
.
'[a-zA-Z][^A-Z]*'
como expresión regular.print(re.findall('^[a-z]+|[A-Z][^A-Z]*', 'theLongAndWindingRoad'))
Aquí hay una solución alternativa de expresiones regulares. El problema se puede expresar como "¿cómo inserto un espacio antes de cada letra mayúscula, antes de dividir":
Esto tiene la ventaja de preservar todos los caracteres que no son espacios en blanco, lo que la mayoría de las otras soluciones no hacen.
fuente
Si desea
"It'sATest"
dividir para["It's", 'A', 'Test']
cambiar el rexeg a"[A-Z][a-z']*"
fuente
drops
regulares también todas las palabras regulares (simplemente alfa) que no comienzan con una letra mayúscula. Dudo que esa fuera la intención del OP.Una variación de la solución de @ChristopheD
fuente
Utilice una anticipación:
En Python 3.7, puede hacer esto:
Y rinde:
fuente
o
fuente
[s for s in re.compile(r"([A-Z][^A-Z]*)").split( "TheLongAndWindingRoad") if s]
dando['The', 'Long', 'And', 'Winding', 'Road']
filter
es el mismo que la comprensión de la lista con una condición. ¿Tienes algo en contra?filter(lambdaconditionfunc, ...)
b) en Python 3,filter()
devuelve un iterador. Por tanto, no serán totalmente equivalentes. c) Supongo que tambiénfilter()
es más lentofuente
Creo que una mejor respuesta podría ser dividir la cadena en palabras que no terminen en mayúscula. Esto manejaría el caso en el que la cadena no comience con una letra mayúscula.
ejemplo:
fuente
Solución alternativa (si no le gustan las expresiones regulares explícitas):
fuente
Otro sin expresiones regulares y la capacidad de mantener mayúsculas contiguas si se desea
fuente
Esto es posible con la
more_itertools.split_before
herramienta.more_itertools
es un paquete de terceros con más de 60 herramientas útiles que incluyen implementaciones para todas las recetas originales de itertools , lo que evita su implementación manual.fuente
Una forma alternativa sin usar expresiones regulares o enumerar:
Creo que es más claro y simple sin encadenar demasiados métodos o usar una lista larga de comprensión que puede ser difícil de leer.
fuente
Una forma alternativa usando
enumerate
yisupper()
Código:
Salida:
fuente
Compartiendo lo que me vino a la mente cuando leí el post. Diferente de otras publicaciones.
fuente
La forma pitónica podría ser:
Funciona bien para Unicode, evitando re / re2.
fuente
Reemplace cada letra mayúscula 'L' en el dado con un espacio vacío más esa letra "L". Podemos hacer esto usando la comprensión de listas o podemos definir una función para hacerlo de la siguiente manera.
Si elige ir por una función, así es como.
En el caso del ejemplo dado:
Pero la mayoría de las veces que dividimos una oración en letras mayúsculas, suele ocurrir que queremos mantener abreviaturas que suelen ser un flujo continuo de letras mayúsculas. El siguiente código ayudaría.
Gracias.
fuente