-1

いくつかの異なる一致のリストを文字列で検索する必要があります。たとえば、次のリストがあるとします。

['this', 'is', 'a', 'regex', 'test']

正規表現または Python の他の方法を使用して、これらの項目のいずれかが文字列内にあるかどうかを確認したいと考えています。

最初に試してみstring in listましたが、それでは不十分であることが判明したため、次のような正規表現で条件を連結してみました。

(this|is)(a|regex)(text)

しかし、それはあたかもそれらが連結されているかのように、いくつかの項目を一致させようとします。

4

3 に答える 3

3

組み込み関数を使用できますany()

In [1]: strs="I am a string"

In [2]: lis=['this', 'is', 'a', 'regex', 'test']

In [3]: any(x in strs for x in lis)
Out[3]: True

これも同様に返さTrue"thisisafoobar"ます。

ただし、正確な単語に一致させたい場合は、re.search()orを試してstr.split()ください。

In [4]: import re

In [5]: any(re.search(r"\b{0}\b".format(x),strs) for x in lis)
Out[5]: True

In [6]: strs="foo bar"

In [7]: any(re.search(r"\b{0}\b".format(x),strs) for x in lis)
Out[7]: False

使用str.split():

In [12]: strs="I am a string"

In [13]: spl=strs.split()    #use set(strs.split()) if the list returned is huge

In [14]: any(x in spl for x in lis)
Out[14]: True

In [15]: strs="Iamastring"

In [16]: spl=strs.split()

In [17]: any(x in spl for x in lis)
Out[17]: False
于 2013-03-13T02:33:19.023 に答える
2
>>> l = ['this', 'is', 'a', 'regex', 'test']
>>> s = 'this is a test string'
>>> def check(elements, string):
...     for element in elements:
...         if element in string:
...             return True
...     return False
... 
>>> check(l, s)
True

どうやらこの関数はany()

import time

def main():
    # Making a huge list
    l = ['this', 'is', 'a', 'regex', 'test'] * 10000
    s = 'this is a test string'

    def check(elements, string):
        for element in elements:
            if element in string:
                return True
        return False

    def test_a(elements, string):
        """Testing check()"""
        start = time.time()
        check(elements, string)
        end = time.time()
        return end - start

    def test_b(elements, string):
        """Testing any()"""
        start = time.time()
        any(element in string for element in elements)
        end = time.time()
        return end - start

    print 'Using check(): %s' % test_a(l, s)
    print 'Using any(): %s' % test_b(l, s)

if __name__ == '__main__':
    main()

結果:

pearl:~ pato$ python test.py 
Using check(): 3.09944152832e-06
Using any(): 5.96046447754e-06
pearl:~ pato$ python test.py 
Using check(): 1.90734863281e-06
Using any(): 7.15255737305e-06
pearl:~ pato$ python test.py 
Using check(): 2.86102294922e-06
Using any(): 6.91413879395e-06

しかし、 のように と組み合わせるany()と、結果は次のmap()ようになります。any(map(lambda element: element in string, elements))

pearl:~ pato$ python test.py 
Using check(): 3.09944152832e-06
Using any(): 0.00903916358948
pearl:~ pato$ python test.py 
Using check(): 2.86102294922e-06
Using any(): 0.00799989700317
pearl:~ pato$ python test.py 
Using check(): 3.09944152832e-06
Using any(): 0.00829982757568
于 2013-03-13T02:33:52.203 に答える
1

あなたがすることができます:

if any(test in your_string for test in tests):
    ...
于 2013-03-13T02:33:08.980 に答える