2015-10-29 11 views
8

は、私はそれのポイントで、私はグループ内で、私はそのリストを持っている文字列のいずれかに一致することができ、正規表現を作りたいPythonの正規表現で文字列のリストの文字列を一致させるにはどうすればよいですか?

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

、私は文字列のリストを持っていると言うことができます、このような:

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

は何これを行うには正しい方法でしょうか?あるいは、複数の正規表現を作成し、それらをすべて文字列に別々にマッチさせる必要がありますか?それは代わりにstart.Use findallから一致するよう

+0

を 'と配列要素入会| DUM | |'接着剤として、 '楽しみとして文字列を形成することになるが日| gum'ました正規表現で使用することができます。 – Tushar

+3

're.findall(r" ['\ w] + "、これはちょうど楽しみのためのzのためのstring_listの任意の" z "のre.search(' | '.join(string_lst)、input_string)' –

+0

' ) ' –

答えて

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

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

あなたはmatchを使用することはできません。

出力:['fun']

searchを使ってあなただけの最初match.So代わりfindallを使用するを取得します。

また、同じポイントから重複しない一致がある場合はlookaheadを使用してください。

+0

「re.search」はなぜですか? –

+0

そのような洗練されたソリューション! –

+1

確かに非常に良い解決策。ありがとう – user3341078

1

正規表現を除いて、リストの理解を使用することができます。

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

正規表現に

>>> 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を組み合わせることという名前のリスト(実際にセット)を持つ前に、あなたは正しく文字列をエスケープするようにしてください:

#!/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') 

ここwordsだけですあなたは好きなものを使うことができます。 .*の代わりに、
.search()のメソッドが使用されます。

STDLIBのreモジュールを使用して、指定されたリストをエミュレートするには、次の

#!/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()

は、個々の単語の内側 .*?として(文字通りの言葉と一致するように)正規表現のメタ文字をエスケープするために使用されます。
sorted() regex動作をエミュレートし、それが比較、最初の選択肢の中最長の単語を置く:

>>> 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'] 
関連する問題