2013-03-13 2 views
-1

мне нужно искать строку для списка нескольких матчей, скажем, у меня есть этот список:Multi-условие регулярных выражений в Python

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

Я хочу, чтобы увидеть, если любой из этих элементов находится в пределах строки , либо используя регулярное выражение, либо любой другой метод в Python.

Я попробовал первый раз делает string in list, но оказалось недостаточно, поэтому я попытался конкатенации условия в регулярных выражениях, как:

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

Но что пытается соответствовать несколько элементов, как если бы они были слиты ,

+0

и что это именно вы хотите, чтобы соответствовать ?? – enginefree

+0

Только это, посмотрите, содержит ли строка несколько разных шаблонов/слов, не прибегая к нескольким условностям. – 8vius

+0

Почему вы разделили их на несколько групп? регулярное выражение будет '(this | is | a | regex | test)' –

ответ

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() или 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 
1

Вы можете сделать:

if any(test in your_string for test in tests): 
    ... 
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 
Смежные вопросы