2016-05-26 2 views
0

J'ai des problèmes pour faire correspondre le caractère de soulignement en Python à l'aide d'expressions régulières. Juste à jouer dans la coquille, je reçois:Comment faire correspondre un trait de soulignement en utilisant regex de Python?

>>> import re 
>>> re.match(r'a', 'abc') 
<_sre.SRE_Match object at 0xb746a368> 
>>> re.match(r'_', 'ab_c') 
>>> re.match(r'[_]', 'ab_c') 
>>> re.match(r'\_', 'ab_c') 

Je me serais attendu au moins un d'entre eux pour renvoyer un objet de match. Est-ce que je fais quelque chose de mal?

+4

're.match' retourne match de si elle est dans le démarrage de string..use' re.search' – rock321987

+0

Merci, je ne savais pas que. – user1575106

+0

're.match (r '. * \ _. *', Chaîne)'? – MaxNoe

Répondre

1

les opérations suivantes:

re.search(r'\_', 'ab_c') 

Vous étiez en effet droit d'échapper au caractère underscore! l'esprit que vous ne pouvez utiliser match pour le début de la chaîne, ainsi qu'il ressort également de la documentation (https://docs.python.org/2/library/re.html):

Si zéro ou plusieurs caractères au début de la chaîne correspondent au modèle d'expression régulière, le retour d'un correspondant Instance MatchObject. Renvoie None si la chaîne ne correspond pas au modèle; Notez que cela est différent d'une correspondance de longueur nulle.

Vous devez utiliser search dans ce cas:

parcourons chaîne à la recherche du premier emplacement où le modèle d'expression régulière produit un match, et retourner une instance MatchObject. Renvoie Aucun si aucune position dans la chaîne ne correspond au motif; Notez que cela est différent de trouver une correspondance de longueur nulle à un certain point dans la chaîne.

+2

Le problème ici n'échappe pas au trait de soulignement: c'est que OP utilise 'match' et ils veulent' search' –

1

Utilisation re.search au lieu de re.match si le modèle que vous recherchez est pas au début de la chaîne de recherche.

re.match (motif, chaîne, drapeaux = 0)

Essayez d'appliquer le modèle au début de la chaîne, le retour d'un objet match de ou Aucun si aucune correspondance n'a été trouvée.

re.search (motif, chaîne, drapeaux = 0)

parcourons chaîne à la recherche d'un match au motif, de retour d'un objet de correspondance ou Aucun si aucune correspondance n'a été trouvée.

Vous n'avez pas besoin d'échapper _ ou même d'utiliser une chaîne brute.

>>> re.search('_', 'ab_c') 
Out[4]: <_sre.SRE_Match object; span=(2, 3), match='_'>