Puede usar grupos coincidentes:
p = re.compile('name (.*) is valid')
p.ej
>>> import re
>>> p = re.compile('name (.*) is valid')
>>> s = """
... someline abc
... someother line
... name my_user_name is valid
... some more lines"""
>>> p.findall(s)
['my_user_name']
Aquí uso en re.findall
lugar de re.search
obtener todas las instancias de my_user_name
. Utilizando re.search
, necesitaría obtener los datos del grupo en el objeto de coincidencia:
>>> p.search(s) #gives a match object or None if no match is found
<_sre.SRE_Match object at 0xf5c60>
>>> p.search(s).group() #entire string that matched
'name my_user_name is valid'
>>> p.search(s).group(1) #first group that match in the string that matched
'my_user_name'
Como se menciona en los comentarios, es posible que desee que su expresión regular no sea codiciosa:
p = re.compile('name (.*?) is valid')
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.
group(0)
para el primer partido?