Python 2.7.1 Estoy tratando de usar la expresión regular de Python para extraer palabras dentro de un patrón
Tengo una cuerda que se ve así
someline abc
someother line
name my_user_name is valid
some more lines
Quiero extraer la palabra "my_user_name". Hago 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>
¿Cómo extraigo my_user_name ahora?
group(0)
para el primer partido?group(0)
devuelve el texto coincidente, no el primer grupo de captura. El comentario del código es correcto, mientras que parece confundir los grupos de captura y las coincidencias.group(1)
devuelve el primer grupo de captura.NameError: name '_' is not defined
_ = p.search(s)
. Veo que menciona establecer el resultado,_
pero el código no refleja eso. Cambié a_ = p.search(s)
esa segunda línea y funciona._
. No es válido fuera de ningún otro lado.Puede usar grupos coincidentes:
p.ej
Aquí uso en
re.findall
lugar dere.search
obtener todas las instancias demy_user_name
. Utilizandore.search
, necesitaría obtener los datos del grupo en el objeto de coincidencia:Como se menciona en los comentarios, es posible que desee que su expresión regular no sea codiciosa:
para recoger solo las cosas entre
'name '
y el siguiente' is valid'
(en lugar de permitir que su expresión regular recoja otras' is valid'
en su grupo.fuente
(.*?)
? Sí, eso es posible, aunque no es necesario a menos que OP nos usere.DOTALL
re.findall('name (.*) is valid', 'name jon clements is valid is valid is valid')
probablemente no dará los resultados deseados ....group
es exactamente la misma que la respuesta que aceptó ...Podrías usar algo como esto:
fuente
Quizás sea un poco más corto y fácil de entender:
fuente
Quieres un grupo de captura .
fuente
Puede usar grupos (indicados con
'('
y')'
) para capturar partes de la cadena. Elgroup()
método del objeto de coincidencia le proporciona los contenidos del grupo:En Python 3.6+ también puede indexar en un objeto de coincidencia en lugar de usar
group()
:fuente
Aquí hay una manera de hacerlo sin usar grupos (Python 3.6 o superior):
fuente
También puede usar un grupo de captura
(?P<user>pattern)
y acceder al grupo como un diccionariomatch['user']
.fuente
Parece que en realidad estás tratando de extraer un vicio de nombre, simplemente encuentra una coincidencia. Si este es el caso, es útil tener índices de extensión para su coincidencia y recomiendo usarlo
re.finditer
. Como método abreviado, sabe que laname
parte de su expresión regular es longitud 5 yis valid
longitud 9, por lo que puede cortar el texto correspondiente para extraer el nombre.Nota: en su ejemplo, parece que
s
es una cadena con saltos de línea, así que eso es lo que se supone a continuación.fuente