2015-12-29 3 views
9

Wenn Bedarf entsprechen zu sagenÜberprüfen Sie, ob eine Liste einen oder mehrere Strings hat, die einen regulären Ausdruck

if <this list has a string in it that matches this rexeg>: 
    do_stuff() 

I found dieses mächtige Konstrukt zu extrahieren passenden Strings aus einer Liste:

[m.group(1) for l in my_list for m in [my_regex.search(l)] if m] 

... aber das ist schwer zu lesen und zu übertreiben. Ich will die Liste nicht, ich möchte nur wissen, ob eine solche Liste etwas enthalten würde.

Gibt es einen einfacheren Weg, diese Antwort zu bekommen?

Antwort

7

Sie können einfach any verwenden. Demo:

>>> lst = ['hello', '123', 'SO'] 
>>> any(re.search('\d', s) for s in lst) 
True 
>>> any(re.search('\d{4}', s) for s in lst) 
False 

Verwendung re.match, wenn Sie von Anfang an der String-Matching erzwingen möchten.

Erklärung:

any prüft, ob es einen truthy Wert in einem iterable ist. Im ersten Beispiel geben wir den Inhalt der folgenden Liste (in Form eines Generators):

>>> [re.search('\d', s) for s in lst] 
[None, <_sre.SRE_Match object at 0x7f15ef317d30>, None] 

, die ein Match-Objekt hat die truthy ist, während None immer False in einem Booleschen Kontext evaluieren . Aus diesem Grunde anyFalse für das zweite Beispiel zurück:

>>> [re.search('\d{4}', s) for s in lst] 
[None, None, None] 
+0

Süß und einfach REPL Beispiel! – zedfoxus

+0

Das ist nur soooo richtig :) – GreenAsJade

Verwandte Themen