Je veux obtenir le premier match d'une regex.
Dans ce cas, j'ai une liste:
text = 'aa33bbb44'
re.findall('\d+',text)
[«33», «44»]
Je pourrais extraire le premier élément de la liste:
text = 'aa33bbb44'
re.findall('\d+',text)[0]
«33»
Mais cela ne fonctionne que s'il y a au moins une correspondance, sinon j'obtiendrai une erreur:
text = 'aazzzbbb'
re.findall('\d+',text)[0]
IndexError: index de liste hors de portée
Dans ce cas, je pourrais définir une fonction:
def return_first_match(text):
try:
result = re.findall('\d+',text)[0]
except Exception, IndexError:
result = ''
return result
Existe-t-il un moyen d'obtenir ce résultat sans définir une nouvelle fonction?
len(re.findAll)==0
check à la place.Réponses:
Vous pouvez intégrer la
''
valeur par défaut dans votre regex en ajoutant|$
:>>> re.findall('\d+|$', 'aa33bbb44')[0] '33' >>> re.findall('\d+|$', 'aazzzbbb')[0] '' >>> re.findall('\d+|$', '')[0] ''
Fonctionne également avec
re.search
souligné par d'autres:>>> re.search('\d+|$', 'aa33bbb44').group() '33' >>> re.search('\d+|$', 'aazzzbbb').group() '' >>> re.search('\d+|$', '').group() ''
la source
findall
utilisé?" .Si vous n'avez besoin que de la première correspondance, utilisez à la
re.search
place dere.findall
:>>> m = re.search('\d+', 'aa33bbb44') >>> m.group() '33' >>> m = re.search('\d+', 'aazzzbbb') >>> m.group() Traceback (most recent call last): File "<pyshell#281>", line 1, in <module> m.group() AttributeError: 'NoneType' object has no attribute 'group'
Ensuite, vous pouvez utiliser
m
comme condition de vérification comme:>>> m = re.search('\d+', 'aa33bbb44') >>> if m: print('First number found = {}'.format(m.group())) else: print('Not Found') First number found = 33
la source
J'irais avec:
r = re.search("\d+", ch) result = return r.group(0) if r else ""
re.search
ne recherche que la première correspondance dans la chaîne de toute façon, donc je pense que cela rend votre intention légèrement plus claire que d'utiliserfindall
.la source
Vous ne devriez pas utiliser
.findall()
du tout -.search()
c'est ce que vous voulez. Il trouve la correspondance la plus à gauche, ce que vous voulez (ou retourneNone
si aucune correspondance n'existe).m = re.search(pattern, text) result = m.group(0) if m else ""
Que vous souhaitiez mettre cela dans une fonction dépend de vous. Il est inhabituel de vouloir renvoyer une chaîne vide si aucune correspondance n'est trouvée, c'est pourquoi rien de tel n'est intégré. Il est impossible de se demander si
.search()
elle-même trouve une correspondance (elle renvoieNone
si ce n'est pas le cas, ou unSRE_Match
objet si c'était le cas).la source
Tu peux faire:
x = re.findall('\d+', text) result = x[0] if len(x) > 0 else ''
Notez que votre question n'est pas exactement liée à regex. Au contraire, comment trouver en toute sécurité un élément d'un tableau, s'il n'en a pas.
la source
Peut-être que cela fonctionnerait un peu mieux dans le cas où une plus grande quantité de données d'entrée ne contient pas votre pièce souhaitée car sauf a un coût plus élevé.
def return_first_match(text): result = re.findall('\d+',text) result = result[0] if result else "" return result
la source