Найти элемент массива в строке - PullRequest
5 голосов
/ 02 мая 2011

Я знаю, можно использовать string.find() для поиска подстроки в строке.

Но как проще всего выяснить, имеет ли один из элементов массива совпадение подстроки в строке без использования цикла?

Псевдокод:

string = 'I would like an apple.'
search = ['apple','orange', 'banana']
string.find(search) # == True

Ответы [ 3 ]

21 голосов
/ 02 мая 2011

Вы можете использовать выражение генератора (которое так или иначе представляет собой цикл)

any(x in string for x in search)

Выражение генератора - это часть внутри скобок.Он создает итерацию, которая возвращает значение x in string для каждого x в кортеже search.x in string в свою очередь возвращает, содержит ли string подстроку x.Наконец, встроенный в Python any() перебирает итерацию, которую он передает, и возвращает, если какой-либо из его элементов оценивается как True.

В качестве альтернативы, вы можете использовать регулярное выражениечтобы избежать цикла:

import re
re.search("|".join(search), string)

Я бы выбрал первое решение, поскольку у регулярных выражений есть подводные камни (экранирование и т. д.).

3 голосов
/ 02 мая 2011

Строки в Python являются последовательностями, и вы можете быстро проверить членство, просто спросив, существует ли одна строка внутри другой:

>>> mystr = "I'd like an apple"
>>> 'apple' in mystr
True

Свен понял это правильно в своем первом ответе выше. Чтобы проверить, существует ли какая-либо из нескольких строк в какой-либо другой строке, вам нужно сделать:

>>> ls = ['apple', 'orange']
>>> any(x in mystr for x in ls)
True

Стоит отметить, что для дальнейшего использования встроенная функция 'all ()' вернет true, только если все элементы в 'ls' были членами 'mystr':

>>> ls = ['apple', 'orange']
>>> all(x in mystr for x in ls)
False
>>> ls = ['apple', 'like']
>>> all(x in mystr for x in ls)
True
1 голос
/ 02 мая 2011

Чем проще

import re
regx = re.compile('[ ,;:!?.:]')

string = 'I would like an apple.'
search = ['apple','orange', 'banana']

print any(x in regx.split(string) for x in search)

EDIT

Исправление, прочитав ответ Свена: очевидно, строка не должна быть расщеплена, глупая! any(x in string for x in search) работает довольно хорошо

Если вы не хотите петли:

import re
regx = re.compile('[ ,;:!?.:]')

string = 'I would like an apple.'
search = ['apple','orange', 'banana']
print regx.split(string)

print set(regx.split(string)) & set(search)

результат

set(['apple'])
...