Python 2.7.1 J'essaie d'utiliser l'expression régulière python pour extraire des mots à l'intérieur d'un modèle
J'ai une ficelle qui ressemble à ça
someline abc
someother line
name my_user_name is valid
some more lines
Je veux extraire le mot "mon_nom_utilisateur". Je fais quelque chose comme
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>
Comment extraire mon_nom_utilisateur maintenant?
group(0)
pour le premier match?group(0)
renvoie le texte correspondant, pas le premier groupe de capture. Le commentaire du code est correct, alors que vous semblez confondre les groupes de capture et les correspondances.group(1)
renvoie le premier groupe de capture.NameError: name '_' is not defined
_ = p.search(s)
. Je vois qu'il mentionne la définition du résultat sur_
mais le code ne reflète pas cela. J'ai changé_ = p.search(s)
pour cette deuxième ligne et cela fonctionne._
. Ce n'est valable nulle part ailleurs.Vous pouvez utiliser des groupes correspondants:
par exemple
Ici, j'utilise
re.findall
plutôt quere.search
pour obtenir toutes les instances demy_user_name
. En utilisantre.search
, vous devez obtenir les données du groupe sur l'objet de correspondance:Comme mentionné dans les commentaires, vous voudrez peut-être rendre votre regex non gourmande:
pour ne ramasser que les choses entre
'name '
et le suivant' is valid'
(plutôt que de permettre à votre regex d'en prendre d'autres' is valid'
dans votre groupe.la source
(.*?)
? Ouais, c'est possible, mais pas nécessaire, sauf si nous utilisons OPre.DOTALL
re.findall('name (.*) is valid', 'name jon clements is valid is valid is valid')
ne donnera probablement pas les résultats souhaités ....group
est exactement la même que la réponse que vous avez acceptée ...Vous pouvez utiliser quelque chose comme ceci:
la source
C'est peut-être un peu plus court et plus facile à comprendre:
la source
Vous voulez un groupe de capture .
la source
Vous pouvez utiliser des groupes (indiqués par
'('
et')'
) pour capturer des parties de la chaîne. Lagroup()
méthode de l'objet match vous donne alors le contenu du groupe:Dans Python 3.6+, vous pouvez également indexer dans un objet de correspondance au lieu d'utiliser
group()
:la source
Voici un moyen de le faire sans utiliser de groupes (Python 3.6 ou supérieur):
la source
Vous pouvez également utiliser un groupe de capture
(?P<user>pattern)
et accéder au groupe comme un dictionnairematch['user']
.la source
Il semble que vous essayez en fait d'extraire un nom et de trouver simplement une correspondance. Si tel est le cas, il est utile d'avoir des index span pour votre correspondance et je vous recommande de les utiliser
re.finditer
. En tant que raccourci, vous savez que laname
partie de votre expression régulière est de longueur 5 et lais valid
longueur est de 9, vous pouvez donc découper le texte correspondant pour extraire le nom.Remarque - Dans votre exemple, cela ressemble à une
s
chaîne avec des sauts de ligne, c'est donc ce qui est supposé ci-dessous.la source