python's re: return True se la stringa contiene il pattern regex


98

Ho un'espressione regolare come questa:

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

La funzione deve restituire True se la parola contiene bar , baz o bad . In breve, ho bisogno dell'analogo regexp per Python

'any-string' in 'text'

Come posso realizzarlo? Grazie!


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

Risposte:


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

1
Sto lavorando a un caso simile in cui voglio cercare una stringa esatta ( xyz) e voglio sapere qual è un modo più efficiente per farlo, dovrei usare python 'xyz' in given_texto usare re.compile(r'xyz').search(given_text)?
bawejakunal

1
le []parentesi contengono una classe di caratteri, quindi la tua corrispondenza corrisponde anche a: >>> word = 'ba |'; regexp.search (word) <_sre.SRE_Match object at 0x101030b28>. Puoi rilasciare tutti i simboli del tubo.
radtek

104

Il migliore in assoluto lo è

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

Restituisce True


2
Perché questa è migliore delle altre soluzioni?
kres0345

1
Per prima cosa, restituisce un file bool. OP: "deve restituire Truese la parola contiene bar, baz o bad." Altre risposte utilizzano il comportamento di if- conversione automatica dell'espressione alla sua destra in un file bool. ad es. import re; rgx=re.compile(r'ba[rzd]'); rgx.search('foobar')=> <re.Match object; span=(2, 5), match='bar'>, ma if(rgx.search(w)): print('y')=> y. Il più vicino alla documentazione della conversione automatica che ho trovato ( archiviato )
bballdave025

15

Matchgli oggetti sono sempre veri e Nonevengono restituiti se non c'è corrispondenza. Prova solo la veridicità.

Codice:

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

Uscita = bar

Se vuoi searchfunzionalità

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

e se regexpnon trovato di

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

Come menzionato da @bukzor, se st = foo barthan match non funzionerà. Quindi, è più appropriato da usare re.search.


1
A quanto ho capito la domanda, OP vuole effettivamente searchpiuttosto che match. (Vedi docs.python.org/library/re.html#matching-vs-searching. ) Inoltre, penso che sarebbe utile se mostrassi i possibili argomenti effettivi, nell'ordine corretto, piuttosto che solo ....
ruakh

1
se si stpassa a "foo bar", il metodo di corrispondenza non funzionerà qui. Vuoi cercare.
bukzor

@ruakh quel collegamento non scorre più automaticamente a quella parte del documento, ora il collegamento è docs.python.org/2/library/re.html#search-vs-match
freeforall tousez

@RanRag qual è la differenza di complessità nella ricerca di sottostringhe con ine regex?
Piyush S. Wanare

1

Ecco una funzione che fa quello che vuoi:

import re

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

Il metodo di ricerca delle espressioni regolari restituisce un oggetto in caso di esito positivo e Nessuno se il modello non viene trovato nella stringa. Con questo in mente, restituiamo True fintanto che la ricerca ci restituisce qualcosa.

Esempi:

>>> 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

Puoi fare qualcosa del genere:

L'utilizzo della ricerca restituirà un oggetto SRE_match, se corrisponde alla stringa di ricerca.

>>> 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()

In caso contrario, restituirà Nessuno

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

E solo per stamparlo per dimostrare di nuovo:

>>> print n
None
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.