Cadena dividida de Python basada en expresiones regulares

114

¿Cuál es la mejor manera de dividir una cadena "HELLO there HOW are YOU"con palabras en mayúsculas (en Python)?

Entonces terminaría con una matriz como tal: results = ['HELLO there', 'HOW are', 'YOU']


EDITAR:

Yo he tratado:

p = re.compile("\b[A-Z]{2,}\b")
print p.split(page_text)

Sin embargo, no parece funcionar.

Toto
fuente
2
¿Qué has probado ? - ¿No pudiste encontrar re.split()?
Gareth Latty
5
Cuando dice que algo no funciona, debe explicar por qué. ¿Obtienes una excepción? (Si es así, publique toda la excepción) ¿Obtiene el resultado incorrecto?
Gareth Latty

Respuestas:

134

yo sugiero

l = re.compile("(?<!^)\s+(?=[A-Z])(?!.\s)").split(s)

Mira esta demostración .

Ωmega
fuente
5
¿Qué pasa cuando no usas compilar?
Feelsbadman
3
Según los nuevos documentos , "la mayoría de las operaciones de expresión regular están disponibles como funciones de nivel de módulo y métodos RegexObject. Las funciones son atajos que no requieren que compile un objeto regex primero, pero pierden algunos parámetros de ajuste fino " . Puede usar re.split(re.split(pattern, string, maxsplit=0, flags=0))como se menciona en los documentos citados anteriormente.
ZaydH
57

Podrías usar una mirada anticipada:

re.split(r'[ ](?=[A-Z]+\b)', input)

Esto se dividirá en cada espacio seguido por una cadena de letras mayúsculas que terminan en un límite de palabra.

Tenga en cuenta que los corchetes son solo para facilitar la lectura y también podrían omitirse.

Si es suficiente que la primera letra de una palabra esté en mayúsculas (por lo tanto, si también desea dividir en frente de Hello), se vuelve aún más fácil:

re.split(r'[ ](?=[A-Z])', input)

Ahora, esto se divide en cada espacio seguido de cualquier letra mayúscula.

Martin Ender
fuente
1
¿Cómo cambiaría re.split(r'[ ](?=[A-Z]+\b)', input)para que no encontrara letras mayúsculas? Por ejemplo, ¿no coincidiría con "A"? Lo intenté re.split(r'[ ](?=[A-Z]{2,}+\b)', input). ¡Gracias!
@JamesEggers ¿Quiere decir que desea requerir al menos dos letras mayúsculas, para no dividir en palabras como I? re.split(r'[ ](?=[A-Z]{2,}\b)', input)Deberías hacerlo.
Martin Ender
2
Sugeriría al menos [ ]+o tal vez incluso \W+detectar un poco más de casos. Aún así, una buena respuesta.
georg
Intenté el mismo enfoque. Sin embargo, tener un [ ]no funcionó para mí. En cambio, usé \s. La re.split("\s(?=[A-Z]+\s)", string)
expresión regular
0

Su pregunta contiene el literal de cadena "\b[A-Z]{2,}\b", pero eso \bsignificará retroceso, porque no hay un modificador r.

Proveedores: r"\b[A-Z]{2,}\b".

druida62
fuente