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

  • Gibt es einen Weg, um wirklich komplizierte reguläre Ausdrücke in Python zu pflücken?
  • Regex / Code für das Entfernen von "FWD", "RE", etc, von E-Mail-Thema
  • Wie teile ich die Integer und Operatoren Zeichen aus String in Python?
  • Wortanalyse und Scoring aus einer Datei python
  • Einige Charaktere, die '\' vor ihnen verwenden müssen, um zu löschen
  • Was bedeutet [^.] * In regulärem Ausdruck?
  • Regex Frage über Parsing Methode Signatur
  • Javascript Variable mit HTML-Code Regex E-Mail-Matching
  • 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> 
    Python ist die beste Programmiersprache der Welt.