String dividida em Python com base em regex

115

Qual é a melhor maneira de dividir uma string "HELLO there HOW are YOU"por palavras em maiúsculas (em Python)?

Então, eu acabaria com uma matriz como esta: results = ['HELLO there', 'HOW are', 'YOU']


EDITAR:

Eu tentei:

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

Mas não parece funcionar.

Totó
fonte
2
O que você tentou ? - Você não conseguiu encontrar re.split()?
Gareth Latty
5
Quando você diz que algo não funciona, você deve explicar o porquê. Você consegue uma exceção? (Em caso afirmativo, poste a exceção inteira) Você obteve a saída errada?
Gareth Latty

Respostas:

134

Eu sugiro

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

Confira esta demonstração .

Ωmega
fonte
5
o que acontece quando você não usa compilar?
Feelsbadman
3
De acordo com os relatórios , "a maioria das operações de expressão regular estão disponíveis como funções de nível de módulo e métodos RegexObject. As funções são atalhos que não exigem que você compile um objeto regex primeiro, mas falham alguns parâmetros de ajuste fino. " re.split(re.split(pattern, string, maxsplit=0, flags=0))conforme mencionado nos documentos citados anteriormente.
ZaydH
57

Você poderia usar um lookahead:

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

Isso se dividirá em cada espaço seguido por uma sequência de letras maiúsculas que terminam em um limite de palavra.

Observe que os colchetes são apenas para facilitar a leitura e também podem ser omitidos.

Se for suficiente que a primeira letra de uma palavra seja maiúscula (então se você quiser dividir na frente Hellotambém) fica ainda mais fácil:

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

Agora, isso se divide em cada espaço seguido por qualquer letra maiúscula.

Martin Ender
fonte
1
Como eu mudaria re.split(r'[ ](?=[A-Z]+\b)', input)para não encontrar letras maiúsculas? Por exemplo, não corresponderia a "A"? Eu tentei re.split(r'[ ](?=[A-Z]{2,}+\b)', input). obrigado!
@JamesEggers Você quer dizer que deseja exigir pelo menos duas letras maiúsculas, para não se dividir em palavras como I? re.split(r'[ ](?=[A-Z]{2,}\b)', input)deve fazer isso.
Martin Ender
2
Eu sugeriria pelo menos [ ]+ou talvez até \W+pegar um pouco mais casos. Ainda assim, uma boa resposta.
georg
Tentei a mesma abordagem. No entanto, ter um [ ]não funcionou para mim. Em vez disso, eu usei \s. A regexp completa que funcionou para mim foire.split("\s(?=[A-Z]+\s)", string)
h3xh4wk
0

Sua pergunta contém a string literal "\b[A-Z]{2,}\b", mas isso \bsignificará retrocesso, porque não há modificador r.

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

druid62
fonte