2015-12-29 5 views
9

Jeśli trzeba powiedziećSprawdź, czy lista ma jeden lub więcej ciągów, które odpowiadają regex

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

I found ten potężny konstruktu wyodrębnić pasujące ciągi z listy:

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

... ale trudno to odczytać i przesadzić. Nie chcę tej listy, chcę tylko wiedzieć, czy taka lista będzie zawierała cokolwiek.

Czy istnieje prostszy sposób na uzyskanie tej odpowiedzi?

Odpowiedz

7

Możesz po prostu użyć any. 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 

użycie re.match jeśli chcesz wymusić dopasowanie od początku łańcucha.

Wyjaśnienie:

any sprawdzi, czy istnieje jakakolwiek wartość truthy w sposób iterable. W pierwszym przykładzie, przekazujemy treść poniższej listy (w postaci generatora):

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

który ma jeden mecz-przedmiot, który jest truthy, natomiast None będą zawsze oceniać na False w kontekście logicznym . To dlatego any powróci False dla drugiego przykładu:

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

Słodki i prosty przykład rEPL! – zedfoxus

+0

To jest po prostu bardzo dobre :) – GreenAsJade

Powiązane problemy