python's re: return True si la chaîne contient un motif regex


98

J'ai une expression régulière comme celle-ci:

regexp = u'ba[r|z|d]'

La fonction doit renvoyer True si le mot contient bar , baz ou bad . En bref, j'ai besoin d'analogues de regexp pour Python

'any-string' in 'text'

Comment puis-je m'en rendre compte? Merci!


17
Utilisez simplement bool(re.search('ba[rzd]', 'sometext')).
Raymond Hettinger

Réponses:


154
import re
word = 'fubar'
regexp = re.compile(r'ba[rzd]')
if regexp.search(word):
  print 'matched'

1
Je travaille sur un cas similaire où je veux rechercher une chaîne exacte ( xyz) et je veux savoir quel est le moyen le plus efficace de le faire, dois-je utiliser python 'xyz' in given_textou utiliser re.compile(r'xyz').search(given_text)?
bawejakunal

1
les []crochets contiennent une classe de caractères, donc votre re correspond également à: >>> mot = 'ba |'; regexp.search (mot) <objet _sre.SRE_Match à 0x101030b28>. Vous pouvez supprimer tous les symboles de tuyau.
radtek

104

Le meilleur est de loin

bool(re.search('ba[rzd]', 'foobarrrr'))

Renvoie True


2
Pourquoi celle-ci est-elle meilleure que les autres solutions?
kres0345

1
D'une part, il renvoie un fichier bool. OP: "doit retourner Truesi le mot contient bar, baz ou mauvais." D'autres réponses utilisent le comportement de if- convertir automatiquement l'expression à sa droite en a bool. par exemple import re; rgx=re.compile(r'ba[rzd]'); rgx.search('foobar')=> <re.Match object; span=(2, 5), match='bar'>, mais if(rgx.search(w)): print('y')=> y. La documentation la plus proche de la conversion automatique que j'ai pu trouver ( archivée )
bballdave025

15

Matchobjets sont toujours vrais et Nonesont renvoyés s'il n'y a pas de correspondance. Testez simplement la justesse.

Code:

>>> st = 'bar'
>>> m = re.match(r"ba[r|z|d]",st)
>>> if m:
...     m.group(0)
...
'bar'

Sortie = bar

Si vous voulez des searchfonctionnalités

>>> st = "bar"
>>> m = re.search(r"ba[r|z|d]",st)
>>> if m is not None:
...     m.group(0)
...
'bar'

et si regexpnon trouvé que

>>> st = "hello"
>>> m = re.search(r"ba[r|z|d]",st)
>>> if m:
...     m.group(0)
... else:
...   print "no match"
...
no match

Comme @bukzor l'a mentionné, si st = foo barque match ne fonctionnera pas. Donc, il est plus approprié d'utiliser re.search.


1
Si je comprends bien la question, OP veut en fait searchplutôt que match. (Voir docs.python.org/library/re.html#matching-vs-searching. ) De plus, je pense qu'il serait utile que vous montriez les arguments réels possibles, dans le bon ordre, plutôt que simplement ....
ruakh

1
si vous changez sten "foo bar", la méthode de correspondance ne fonctionnera pas ici. Vous voulez une recherche.
bukzor

@ruakh ce lien ne fait plus défiler automatiquement vers cette partie du document, maintenant le lien est docs.python.org/2/library/re.html#search-vs-match
freeforall tousez

@RanRag quelle est la différence de complexité dans la recherche de sous-chaînes avec inet regex?
Piyush S.Wanare

1

Voici une fonction qui fait ce que vous voulez:

import re

def is_match(regex, text):
    pattern = re.compile(regex, text)
    return pattern.search(text) is not None

La méthode de recherche d'expression régulière renvoie un objet en cas de succès et None si le modèle n'est pas trouvé dans la chaîne. Dans cet esprit, nous retournons True tant que la recherche nous donne quelque chose en retour.

Exemples:

>>> is_match('ba[rzd]', 'foobar')
True
>>> is_match('ba[zrd]', 'foobaz')
True
>>> is_match('ba[zrd]', 'foobad')
True
>>> is_match('ba[zrd]', 'foobam')
False

0

Vous pouvez faire quelque chose comme ceci:

L'utilisation de la recherche renverra un objet SRE_match, s'il correspond à votre chaîne de recherche.

>>> import re
>>> m = re.search(u'ba[r|z|d]', 'bar')
>>> m
<_sre.SRE_Match object at 0x02027288>
>>> m.group()
'bar'
>>> n = re.search(u'ba[r|z|d]', 'bas')
>>> n.group()

Sinon, il retournera Aucun

Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    n.group()
AttributeError: 'NoneType' object has no attribute 'group'

Et juste pour l'imprimer pour le démontrer à nouveau:

>>> print n
None
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.