Cadena dividida en cada posición donde comienza una palabra en mayúsculas

2 minutos de lectura

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

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

Yo he tratado:

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

Sin embargo, no parece funcionar.

  • Cuando dices que algo no funciona, debes explicar por qué. ¿Obtienes una excepción? (Si es así, publique la excepción completa) ¿Obtiene el resultado incorrecto?

    – Gareth Latty

    3 de noviembre de 2012 a las 12:44


Avatar de usuario de Ωmega
Ωmega

yo sugiero

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

Controlar esta demostración.

  • ¿Qué pasa cuando no usas compilar?

    – Se siente mal hombre

    8 de enero de 2019 a las 9:35

  • por el volver a los documentosla mayoría de las operaciones de expresiones regulares están disponibles como funciones de nivel de módulo y métodos RegexObject. Las funciones son atajos que no requieren que primero compiles un objeto regex, pero pierden algunos parámetros de ajuste.” Puedes usar re.split(re.split(pattern, string, maxsplit=0, flags=0)) como se menciona en los documentos citados anteriormente.

    – ZaydH

    23 de abril de 2019 a las 8:59


Podrías usar una búsqueda 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 quisiera dividirla delante de Hello también) 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.

  • como cambiaria re.split(r'[ ](?=[A-Z]+\b)', input) ¿entonces no encontró letras mayúsculas? Por ejemplo, ¿no coincidiría con “A”? Lo intenté re.split(r'[ ](?=[A-Z]{2,}+\b)', input). ¡gracias!

    usuario179169

    3 de noviembre de 2012 a las 12:51


  • @JamesEggers Quiere decir que desea requerir al menos dos letras mayúsculas, para que no se divida en palabras como I? re.split(r'[ ](?=[A-Z]{2,}\b)', input) Deberías hacerlo.

    – Martín Ender

    3 de noviembre de 2012 a las 12:55


  • Yo sugeriría al menos [ ]+ o tal vez incluso \W+ para atrapar un poco más de casos. Aún así, una buena respuesta.

    – jorge

    3 de noviembre de 2012 a las 13:03

  • Intenté el mismo enfoque. Sin embargo, tener un [ ] no funcionó para mí. En cambio, usé \s. La expresión regular completa que funcionó para mí fue re.split("\s(?=[A-Z]+\s)", string)

    – Jitendra

    25 de mayo de 2020 a las 0:55

avatar de usuario de druid62
druida62

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

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

¿Ha sido útil esta solución?