1

私は2つのリストを持っています。

a = ['this;mango', 'is:red', 'test;cat']
b = ['man', 'is', 'can']

b の各要素を繰り返し処理し、その文字列がリスト a に存在するかどうかを確認します。どうやってやるの ?

上記の例の出力は次のようになります。

# is
4

6 に答える 6

2
a = ['this;mango', 'is:red', 'test;cat']
b = ['man', 'is', 'can']

import re

for elem in b:
    for test in a:
        if re.search(r'\b' + re.escape(elem) + r'\b', test):
            print elem

リスト内包表記の使用:

>>> a = ['this;mango', 'is:red', 'test;cat']
>>> b = ['man', 'is', 'can']
>>> 
>>> import re
>>> [elem for elem in b if any(re.search(r'\b' + re.escape(elem) + r'\b', test) for test in a)]
['is']

ループオーバーmaplambda回避するための別のバージョン:explicita

>>> [elem for elem in b if any(map(lambda test: re.search(r'\b' + re.escape(elem) + r'\b', test), a))]
['is']
于 2013-02-17T13:14:20.747 に答える
1

@NPEのソリューションを採用し、単語以外の文字を期待すること\Wは問題ありません。

In [221]: a = ['this;mango', 'is:red', 'test;cat']

In [222]: right = set(reduce(operator.add, list(re.split(r'[\W]', s) for s in a)))

In [223]: right
Out[223]: set(['this', 'is', 'cat', 'mango', 'test', 'red'])

In [224]: left = set(['man', 'is', 'can'])

In [225]: left
Out[225]: set(['is', 'can', 'man'])

In [226]: left &  right
Out[226]: set(['is'])
于 2013-02-17T13:48:59.517 に答える
1

私はあなたが本当にあなたのセパレーターをで指定しなければならないと思います、さもなければ「人」も見つけられるべきです。

>>> a = ['this;mango', 'is:red', 'test;cat']
>>> b = ['man', 'is', 'can']
>>> [elem for elem in b if elem in " ".join(a)]
['man', 'is']
于 2013-02-17T13:23:49.083 に答える
1
In [13]: words = set(reduce(operator.add, (re.split(r'[:;]', s) for s in a)))

In [14]: words
Out[14]: set(['this', 'is', 'cat', 'mango', 'test', 'red'])

In [15]: [w for w in b if w in words]
Out[15]: ['is']
于 2013-02-17T13:14:11.037 に答える
1

これはどう?

[i for i in b if any(i in re.split(r'\W', j) for j in a)]
于 2013-02-17T14:05:06.457 に答える
1

b の要素を組み合わせて、2 番目のループを回避できます。

import re

a = ['this;mango', 'is:red', 'test;cat']
b = ['man', 'is', 'can']


def words_in_strings(words, strings):
    pat = re.compile('|'.join(words))
    for i in strings:
        m = pat.search(i)
        if m:
            yield m.group(0)

for i in words_in_strings(b, a):
    print i
于 2013-02-17T14:15:23.183 に答える