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

  • Die angezeigten Daten können nicht im Quellcode beim Scraping mit Scrapy gefunden werden
  • Regulärer Ausdruck: Bereich finden, außer für einen Buchstaben oder einen Bereich
  • Match Unicode in Ply's Regexes
  • Variable-length-Lookbehind-Assertion-Alternativen für reguläre Ausdrücke
  • Python: Split-String nach Liste der Trennzeichen
  • RegEx: Finde alle Ziffern nach bestimmten Strings
  • Ersetzen Sie das erste Vorkommen des Strings
  • Machen Sie Regex Match dotfiles genau
  • 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.