web-dev-qa-db-ja.com

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.")

これを行う正しい方法は何ですか?または、複数の正規表現を作成し、それらをすべて個別に文字列に一致させる必要がありますか?

16
Josh Weinstein
string_lst = ['fun', 'dum', 'Sun', 'gum']
x="I love to have fun."

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

matchは最初から一致するため使用できません。代わりにfindallを使用してください。

出力:['fun']

searchを使用すると、最初の一致のみが取得されます。そのため、代わりにfindallを使用します。

同じポイントで開始しない一致が重複する場合は、lookaheadも使用します。

20
vks

regex module hasnamed lists(実際に設定):

_#!/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']
_
11
jfs

正規表現を除き、リストの内包表記を使用できます。トピックから外れていないことを願っています。

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']
3
lord63. j

正規表現に結合する前に、文字列を正しくエスケープする必要があります

>>> 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']
1
John La Rooy