Passend alle Zeichen in beliebiger Reihenfolge in regex

Ich bin ein Regex-Neuling, aber ich verstehe, wie man irgendwelche Charaktere in einer Regex-Abfrage in der Reihenfolge (ex. [Abc] mit einem von a, b oder c übereinstimmen wird. Auch ich glaube, "abc" wird abc genau passen).

Doch wie konstruiere ich eine Regex-Abfrage, die alle Zeichen abc in beliebiger Reihenfolge übereinstimmt? Also zum Beispiel möchte ich, dass es mit "cab" oder "bracket" übereinstimmt. Ich benutze Python als meine Skriptsprache (nicht sicher, ob dies zählt oder nicht).

3 Solutions collect form web for “Passend alle Zeichen in beliebiger Reihenfolge in regex”

In Python würde ich zu diesem Zweck keinen regelmäßigen Ausdruck verwenden, sondern vielmehr einen Satz:

>>> chars = set("abc") >>> chars.issubset("bracket") True >>> chars.issubset("fish") False >>> chars.issubset("bad") False 

Reguläre Ausdrücke sind nützlich, aber es gibt Situationen, in denen verschiedene Werkzeuge passender sind.

Dies kann mit Blick auf Aussagen getan werden:

 ^(?=.*a)(?=.*b)(?=.*c) 

Streichhölzer, wenn Ihr String mindestens ein Vorkommen von a , b und c .

Aber wie Sie sehen können, das ist nicht wirklich, was regexes gut sind.

Ich hätte es getan:

 if all(char in mystr for char in "abc"): # do something 

Überprüfung auf Geschwindigkeit:

 >>> timeit.timeit(stmt='chars.issubset("bracket");chars.issubset("notinhere")', ... setup='chars=set("abc")') 1.3560583674019995 >>> timeit.timeit(stmt='all(char in "bracket" for char in s);all(char in "notinhere" for char in s)', ... setup='s="abc"') 1.4581878714681409 >>> timeit.timeit(stmt='r.match("bracket"); r.match("notinhere")', ... setup='import re; r=re.compile("(?=.*a)(?=.*b)(?=.*c)")') 1.0582279123082117 

Hey, schau, der Regex gewinnt! Dies gilt auch für längere Suchzeichenfolgen:

 >>> timeit.timeit(stmt='chars.issubset("bracketed");chars.issubset("notinhere")', ... setup='chars=set("abcde")') 1.4316702294817105 >>> timeit.timeit(stmt='all(char in "bracketed" for char in s);all(char in "notinhere" for char in s)', ... setup='s="abcde"') 1.6696223364866682 >>> timeit.timeit(stmt='r.match("bracketed"); r.match("notinhere")', ... setup='import re; r=re.compile("(?=.*a)(?=.*b)(?=.*c)(?=.*d)(?:.*e)")') 1.1809254199004044 

Hier ist ein zeitlicher Vergleich von issubset gegenüber den regex- Lösungen.

 import re def using_lookahead(text): pat=re.compile(r'^(?=.*a)(?=.*b)(?=.*c)') return pat.search(text) def using_set(text): chars=set('abc') return chars.issubset(text) 

Für kleine Strings kann issubset etwas schneller sein:

 % python -mtimeit -s'import test' "test.using_set('bracket')" 100000 loops, best of 3: 2.63 usec per loop % python -mtimeit -s'import test' "test.using_lookahead('bracket')" 100000 loops, best of 3: 2.87 usec per loop 

Für lange Saiten ist Regex deutlich schneller:

  • Wenn das Spiel zu spät kommt:

     % python -mtimeit -s'import test' "test.using_set('o'*1000+'bracket')" 10000 loops, best of 3: 49.7 usec per loop % python -mtimeit -s'import test' "test.using_lookahead('o'*1000+'bracket')" 100000 loops, best of 3: 6.66 usec per loop 
  • Wenn das Spiel früh kommt:

     % python -mtimeit -s'import test' "test.using_set('bracket'+'o'*1000)" 10000 loops, best of 3: 50 usec per loop % python -mtimeit -s'import test' "test.using_lookahead('bracket'+'o'*1000)" 100000 loops, best of 3: 13.9 usec per loop 

(Um eine Frage in den Kommentaren zu beantworten 🙂 r'^(?=.*a)(?=.*b)(?=.*c)' kann verwendet werden, um eine Übereinstimmung zu signalisieren:

 In [40]: pat=re.compile(r'^(?=.*a)(?=.*b)(?=.*c)') In [41]: pat.search('bracket') Out[41]: <_sre.SRE_Match object at 0x9f9a6b0> 
  • Mit regex in jinja 2 für unmögliche playbooks
  • Python re.sub: ignorieren Rückreferenzen in der Ersatzzeichenfolge
  • Python string manipulation
  • Zusammenpassende verschachtelte Strukturen mit regulären Ausdrücken in Python
  • Regex Matching Alles innerhalb einer Python If Statement
  • Extrahieren von Zeichen aus einer Zeichenfolge in Python
  • Eine exakte Übereinstimmung für String finden
  • Regex, um spezielle Listeneinträge anzupassen II
  • Python - Mit regex, um mehrere Spiele zu finden und auszudrucken
  • Python regulärer Ausdruck ersetzt zwei Situationen mit einem Befehl
  • Elegante Art, Regex zu verwenden, um ordnungsindividuelle Gruppen von Charakteren zu entsprechen, während Begrenzung, wie kann mal ein gegebenes Zeichen erscheinen?
  • Python ist die beste Programmiersprache der Welt.