2015-12-29 7 views
9

Se c'è bisogno di direVerificare se un elenco ha una o più stringhe che corrispondono a un'espressione regolare

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

ho found questo potente costrutto per estrarre stringhe corrispondenti da una lista:

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

... ma questo è difficile da leggere e eccessivo. Non voglio la lista, voglio solo sapere se una tale lista avrebbe qualcosa in essa.

C'è un modo più semplice di lettura per ottenere quella risposta?

risposta

7

È possibile utilizzare semplicemente 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 

uso re.match se si desidera applicare corrispondenza dall'inizio della stringa.

Spiegazione:

any verificherà se v'è alcun valore truthy in un iterabile. Nel primo esempio, si passa il contenuto del seguente elenco (sotto forma di un generatore):

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

che ha una corrispondenza, oggetto è truthy, mentre None sarà sempre restituire False in un contesto booleano . Questo è il motivo per cui any tornerà False per il secondo esempio:

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

dolce e semplice esempio REPL! – zedfoxus

+0

Questo è semplicemente perfetto :) – GreenAsJade

Problemi correlati