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!


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'

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


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.


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.