Jak mogę sprawdzić, czy którykolwiek z ciągów w tablicy istnieje w innym ciągu?
Lubić:
a = ['a', 'b', 'c']
str = "a123"
if a in str:
print "some of the strings found in str"
else:
print "no strings found in str"
Ten kod nie działa, po prostu pokazuje, co chcę osiągnąć.
[abc]
działa również doskonale i będzie szybszy, jeśli będzie więcej niż kilku kandydatów do przetestowania. Ale jeśli ciągi są dowolne i nie znasz ich wcześniej, aby utworzyć wyrażenie regularne, będziesz musiał zastosować toany(x in str for x in a)
podejście.Odpowiedzi:
Możesz użyć
any
:Podobnie, aby sprawdzić, czy znaleziono wszystkie ciągi z listy, użyj
all
zamiastany
.źródło
for x in a
jak „dla każdego elementu na liście”. Ponieważa
jest to lista ciągów ix
jest elementem tej listy,x
jest ciągiem (jeden z „a”, „b”, „c” w oryginalnym przykładzie)any()
jest zdecydowanie najlepszym podejściem, jeśli wszystko, czego chcesz, toTrue
lubFalse
, ale jeśli chcesz wiedzieć, który łańcuch / ciągi pasują, możesz użyć kilku rzeczy.Jeśli chcesz pierwszego dopasowania (z
False
domyślnie):Jeśli chcesz uzyskać wszystkie dopasowania (w tym duplikaty):
Jeśli chcesz uzyskać wszystkie niedubliczne dopasowania (bez względu na kolejność):
Jeśli chcesz uzyskać wszystkie niedubliczne mecze we właściwej kolejności:
źródło
OrderedDict
jest prawdopodobnie bardziej wydajne niż lista. Zobacz tę odpowiedź na temat „Usuwanie duplikatów z list”Należy zachować ostrożność, jeśli struny są dłuższe
a
lubstr
dłuższe. Proste rozwiązania przyjmują O (S * (A ^ 2)), gdzieS
jest długością,str
a A jest sumą długości wszystkich łańcuchówa
. Aby uzyskać szybsze rozwiązanie, spójrz na algorytm Aho-Corasicka do dopasowywania ciągów, który działa w czasie liniowym O (S + A).źródło
Aby dodać trochę różnorodności dzięki
regex
:lub jeśli twoja lista jest za długa -
any(re.findall(r'|'.join(a), str, re.IGNORECASE))
źródło
(
lub*
to się nie powiedzie, ponieważ należy wykonać cytowanie składni wyrażenia regularnego.'|'.join(map(re.escape, strings_to_match))
. Prawdopodobniere.compile('|'.join(...))
również.Musisz iterować po elementach.
źródło
jbernadas wspomniał już o algorytmie Aho-Corasicka w celu zmniejszenia złożoności.
Oto jeden ze sposobów użycia go w Pythonie:
Pobierz aho_corasick.py stąd
Umieść go w tym samym katalogu, co główny plik Python i nazwij go
aho_corasick.py
Wypróbuj alrorithm z następującym kodem:
Pamiętaj, że w wyszukiwaniu rozróżniana jest wielkość liter
źródło
źródło
To zależy od kontekstu, załóżmy, jeśli chcesz sprawdzić pojedynczy dosłownym jak każdy pojedynczy wyraz (A, E, W, .. etc) w wystarczy
jeśli chcesz zaznaczyć dowolny znak spośród słowa oryginalnego: skorzystaj z
jeśli chcesz wszystkich danych wejściowych w tym oryginalnym słowie, skorzystaj ze wszystkich prostych
źródło
Po prostu więcej informacji o tym, jak uzyskać wszystkie elementy listy dostępne w String
źródło
Zaskakująco szybkie podejście polega na użyciu
set
:Działa to, jeśli
a
nie zawiera wartości wieloznakowych (w takim przypadku należy użyć,any
jak podano powyżej ). Jeśli tak, to prościej określića
jako ciąg:a = 'abc'
.źródło
źródło
Użyłbym tego rodzaju funkcji do prędkości:
źródło
źródło