2017-12-24 9 views
-2

Wie kann ich eine Python-Regex definieren, die mit allen Strings übereinstimmt, die mit doppelten Anführungszeichen beginnen ("), alle druckbaren Zeichen enthalten (ASCII 32-126) und mit doppelten Anführungszeichen enden (")?Python-Regex für zitierte druckbare Zeichen

+1

Zur Klarstellung wollten Sie Vorkommen von Zeichenketten finden, die ** muss ** alle druckbaren Zeichen enthalten, oder ** können ** enthalten alle druckbaren Zeichen? Wie wäre es auch mit einer Situation wie dieser: * Der "schnelle" braune Fuchs "sprang" über den faulen Hund. *? Sollte die Regex "schnell" und "humped" oder "schnell" Braunfuchs "gesprungen" sein (wobei ˽ einen Platz zum Lesen bezeichnet)? – CJK

+0

Sorry, ich meine vielleicht enthalten. In diesem Fall ist die zu erkennende Zeichenfolge "quick" und "juped" – Jim

+0

Wenn "all" eine falsche Beschreibung des Problems ist und stattdessen * only *, dann ist es das einfache '^" [- ~] + "$ '. – usr2564301

Antwort

1

Um Ihre Frage zu beantworten:

dies für abc genau das zu tun, können Sie einen regulären Ausdruck schreiben müßten, der sagt: „mit " beginnen, dann was auch immer, schließlich a, dann was auch immer, schließlich b, dann was auch immer, schließlich c, dann was auch immer und schließlich " oder b, dann was auch immer, schließlich a, dann was auch immer, schließlich c, dann was auch immer ... "- und so weiter, für alle 3! = 6 Permutationen.

# declarative 

regex = '^".*(a.*b.*c|a.*c.*b|b.*a.*c|b.*c.*a|c.*a.*b|c.*b.*a).*"$' 

# generative 

import itertools 

regex = '^".*(' 
regex += '|'.join('.*'.join(p) for p in itertools.permutations('abc')) 
regex += ').*"$' 

Wenn Sie jedoch versuchen, dass für alle druckbaren Zeichen zu tun, werden Sie wahrscheinlich über genügend Arbeitsspeicher ausgeführt, wie es (126-32)! = 108736615665674308027365285256786601004186803580182872307497374434045199869417927630229109214583415458560865651202385340530688000000000000000000000 Permutationen. So ...

Ihr Problem zu lösen:

printables = {chr(i) for i in range(32, 127)} 
def f(s): 
    return s.startswith('"') and s.endswith('"') and printables < set(s) 
+0

Danke Dan! Das ist besser als Regex! – Jim

Verwandte Themen