2015-10-29 8 views
8

Lets sagen, dass ich eine Liste von Strings haben,Wie findet man einen String aus einer Liste von Strings in regulären Ausdrücken in Python?

string_lst = ['fun', 'dum', 'sun', 'gum'] 

Ich möchte einen regulären Ausdruck machen, wo an einem Punkt drin, ich kann ich innerhalb einer Gruppe in dieser Liste, jede der Saiten entsprechen, wie dieses:

import re 
template = re.compile(r".*(elem for elem in string_lst).*") 
template.match("I love to have fun.") 

Was wäre der richtige Weg, dies zu tun? Oder müsste man mehrere reguläre Ausdrücke machen und sie alle einzeln an die Zeichenkette anpassen?

+0

die Elemente Array Join mit '|' als Kleber, bilden String als 'Spaß | dum | Sonne | gum' die kann in Regex verwendet werden. – Tushar

+3

're.search ('|' .join (string_lst), input_string)' –

+0

'any (z in string_list für z in re.findall (r" ['\ w] + ",' Dies ist nur zum Spaß ')) ' –

Antwort

13
string_lst = ['fun', 'dum', 'sun', 'gum'] 
x="I love to have fun." 

print re.findall(r"(?=("+'|'.join(string_lst)+r"))",x) 

Sie können nicht match verwenden, wie es von start.Use findall statt übereinstimmen.

Ausgang: ['fun']

search finden sich hier nur die erste match.So findall stattdessen bekommen verwenden.

Verwenden Sie auch lookahead, wenn überlappende Treffer nicht am selben Punkt beginnen.

+0

Warum nicht 're.search'? –

+0

Solch eine elegante Lösung! –

+1

In der Tat sehr gute Lösung. Danke – user3341078

1

Außer dem regulären Ausdruck können Sie Listenverständnis verwenden, hoffe, es ist nicht vom Thema entfernt.

import re 
def match(input_string, string_list): 
    words = re.findall(r'\w+', input_string) 
    return [word for word in words if word in string_list] 

>>> string_lst = ['fun', 'dum', 'sun', 'gum'] 
>>> match("I love to have fun.", string_lst) 
['fun'] 
0

Sie sollten

>>> import re 
>>> string_lst = ['fun', 'dum', 'sun', 'gum'] 
>>> x = "I love to have fun." 
>>> regex = re.compile("(?=(" + "|".join(map(re.escape, string_lst)) + "))") 
>>> re.findall(regex, x) 
['fun'] 
5

regex module hat genannt Listen die Saiten richtig zu entkommen, bevor sie in einem regex Kombination (Sets tatsächlich) stellen Sie sicher:

#!/usr/bin/env python 
import regex as re # $ pip install regex 

p = re.compile(r"\L<words>", words=['fun', 'dum', 'sun', 'gum']) 
if p.search("I love to have fun."): 
    print('matched') 

Hier words ist nur ein Name, Sie können stattdessen alles verwenden, was Sie möchten.
.search() Methoden wird anstelle von .* vor/nach der genannten Liste verwendet.

Um benannte Listen zu emulieren stdlib der mit re Modul:

#!/usr/bin/env python 
import re 

words = ['fun', 'dum', 'sun', 'gum'] 
longest_first = sorted(words, key=len, reverse=True) 
p = re.compile(r'(?:{})'.format('|'.join(map(re.escape, longest_first)))) 
if p.search("I love to have fun."): 
    print('matched') 

re.escape() verwendet wird regex Meta-Zeichen wie .*? innerhalb einzelner Wörter zu entkommen (um die Worte zu passen buchstäblich).
sorted() emuliert regex Verhalten und es setzt die längsten Wörter unter den Alternativen ersten, vergleichen:

>>> import re 
>>> re.findall("(funny|fun)", "it is funny") 
['funny'] 
>>> re.findall("(fun|funny)", "it is funny") 
['fun'] 
>>> import regex 
>>> regex.findall(r"\L<words>", "it is funny", words=['fun', 'funny']) 
['funny'] 
>>> regex.findall(r"\L<words>", "it is funny", words=['funny', 'fun']) 
['funny'] 
Verwandte Themen