pythons re: return True, wenn der String ein Regex-Muster enthält

97

Ich habe einen regulären Ausdruck wie diesen:

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

Die Funktion muss True zurückgeben, wenn das Wort bar , baz oder bad enthält . Kurz gesagt, ich brauche Regexp-Analog für Pythons

'any-string' in 'text'

Wie kann ich das realisieren? Vielen Dank!

Ghostmansd
quelle
17
Einfach benutzen bool(re.search('ba[rzd]', 'sometext')).
Raymond Hettinger

Antworten:

150
import re
word = 'fubar'
regexp = re.compile(r'ba[rzd]')
if regexp.search(word):
  print 'matched'
Mattbornski
quelle
1
Ich arbeite an einem ähnlichen Fall, in dem ich nach einer genauen Zeichenfolge ( xyz) suchen und wissen möchte, welche Methode effizienter ist. Soll ich Python verwenden 'xyz' in given_textoder verwenden re.compile(r'xyz').search(given_text)?
Bawejakunal
1
Die []Klammern enthalten eine Zeichenklasse, daher stimmt Ihr Re auch überein: >>> word = 'ba |'; regexp.search (Wort) <_sre.SRE_Match-Objekt bei 0x101030b28>. Sie können alle Pipe-Symbole löschen.
Radtek
104

Das mit Abstand beste ist

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

Gibt True zurück

Venu Murthy
quelle
2
Warum ist diese eine besser als die anderen Lösungen?
kres0345
1
Zum einen gibt es a zurück bool. OP: "muss zurückkehren, Truewenn das Wort bar, baz oder bad enthält." Andere Antworten verwenden das Verhalten von if- automatische Konvertierung des Ausdrucks in sein Recht in a bool. zB import re; rgx=re.compile(r'ba[rzd]'); rgx.search('foobar')=> <re.Match object; span=(2, 5), match='bar'>, aber if(rgx.search(w)): print('y')=> y. Am nächsten an der Dokumentation der automatischen Konvertierung, die ich finden konnte ( archiviert )
bballdave025
15

MatchObjekte sind immer wahr und Nonewerden zurückgegeben, wenn keine Übereinstimmung vorliegt. Testen Sie einfach die Richtigkeit.

Code:

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

Ausgabe = bar

Wenn Sie searchFunktionalität wünschen

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

und wenn regexpnicht gefunden als

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

Wie @bukzor erwähnt hat, wenn st = foo barthan match nicht funktioniert. Es ist also besser zu verwenden re.search.

RanRag
quelle
1
Wie ich die Frage verstehe, will OP eigentlich searcheher als match. (Siehe docs.python.org/library/re.html#matching-vs-searching. ) Ich denke, es wäre hilfreich, wenn Sie tatsächlich mögliche Argumente in der richtigen Reihenfolge und nicht nur zeigen würden ....
Ruakh
1
wenn Sie ändern stzu "foo bar", wird die Match - Methode hier nicht arbeiten. Sie möchten suchen.
Bukzor
@ruakh dieser Link nicht mehr automatisch zu diesem Teil des Dokuments scrollen, jetzt ist der Link docs.python.org/2/library/re.html#search-vs-match
freeforall tousez
@RanRag Was ist der Komplexitätsunterschied bei der Suche nach Teilzeichenfolgen mit inund regex?
Piyush S. Wanare
1

Hier ist eine Funktion, die macht, was Sie wollen:

import re

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

Die Suchmethode für reguläre Ausdrücke gibt bei Erfolg ein Objekt zurück und None, wenn das Muster nicht in der Zeichenfolge gefunden wird. In diesem Sinne geben wir True zurück, solange die Suche uns etwas zurückgibt.

Beispiele:

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

Sie können so etwas tun:

Bei Verwendung der Suche wird ein SRE_match-Objekt zurückgegeben, wenn es mit Ihrer Suchzeichenfolge übereinstimmt.

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

Wenn nicht, wird None zurückgegeben

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

Und nur um es auszudrucken, um es erneut zu demonstrieren:

>>> print n
None
James R.
quelle