Python 2.7.1 Estou tentando usar a expressão regular do python para extrair palavras dentro de um padrão
Eu tenho uma string que se parece com isso
someline abc
someother line
name my_user_name is valid
some more lines
Eu quero extrair a palavra "my_user_name". Eu faço algo como
import re
s = #that big string
p = re.compile("name .* is valid", re.flags)
p.match(s) #this gives me <_sre.SRE_Match object at 0x026B6838>
Como extraio agora my_user_name?
group(0)
para a primeira partida?group(0)
retorna o texto correspondente, não o primeiro grupo de captura. O comentário do código está correto, enquanto você parece estar confundindo grupos de captura e correspondências.group(1)
retorna o primeiro grupo de captura.NameError: name '_' is not defined
_ = p.search(s)
. Vejo que ele menciona a configuração do resultado,_
mas o código não reflete isso. Mudei para_ = p.search(s)
para a segunda linha e funciona._
. Não é válido fora de nenhum outro lugar.Você pode usar grupos correspondentes:
por exemplo
Aqui eu uso, em
re.findall
vez dere.search
obter todas as instâncias demy_user_name
. Usandore.search
, você precisaria obter os dados do grupo no objeto de correspondência:Conforme mencionado nos comentários, convém tornar sua regex não gananciosa:
para pegar apenas o material entre
'name '
e o próximo' is valid'
(em vez de permitir que o seu regex escolha outro' is valid'
no seu grupo.fonte
(.*?)
? Sim, isso é possível, embora não seja necessário a menos OP-nos usandore.DOTALL
re.findall('name (.*) is valid', 'name jon clements is valid is valid is valid')
provavelmente não produzirá os resultados desejados ....group
é exatamente o mesmo que a resposta que você aceite ...Você poderia usar algo como isto:
fonte
Talvez seja um pouco mais curto e fácil de entender:
fonte
Você quer um grupo de captura .
fonte
Você pode usar grupos (indicados com
'('
e')'
) para capturar partes da sequência. Ogroup()
método do objeto de correspondência fornece o conteúdo do grupo:No Python 3.6+, você também pode indexar em um objeto de correspondência, em vez de usar
group()
:fonte
Aqui está uma maneira de fazer isso sem usar grupos (Python 3.6 ou superior):
fonte
Você também pode usar um grupo de captura
(?P<user>pattern)
e acessar o grupo como um dicionáriomatch['user']
.fonte
Parece que você está realmente tentando extrair um nome vice simplesmente encontrar uma correspondência. Se for esse o caso, ter índices de span para sua correspondência é útil e eu recomendo o uso
re.finditer
. Como atalho, você sabe que aname
parte do seu regex tem o comprimento 5 e ois valid
comprimento 9, para poder dividir o texto correspondente para extrair o nome.Nota - No seu exemplo, parece ser
s
uma string com quebras de linha, então é isso que é assumido abaixo.fonte