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

  • Wie kann ich nur das Wort selbst in einem WordNet-Synchronisieren mit Python NLTK ausdrucken?
  • Pandas CSV mit Stringbegrenzern über Regex lesen
  • Regex String stimmt nicht überein
  • Python Regex, der Platz nach Punkt hinzufügt
  • Reguläre Ausdrücke Bedeutung eines Schrägstrichs /
  • Wie bekomme ich Kommas, Klammern in Python mit regulärem Ausdruck?
  • Ersetzen Sie Text in HTML und BBCode Probe
  • Python Regex Match Text zwischen Anführungszeichen
  • 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.