Вот мой рабочий код, я использую angular4
Это ваша директива для верхнего регистра
import { Directive, ElementRef, HostListener } from '@angular/core';
@Directive({
selector: '[appUpper]'
})
export class UpperDirective {
constructor(public ref: ElementRef) { }
@HostListener('input', ['$event']) onInput(event) {
this.ref.nativeElement.value = event.target.value.toUpperCase();
}
}
Это ваш html-код файла, в котором вы использовали прописную директиву
<input type="text" id="id" placeholder="id" tabindex="0" formControlName="id" appUpper>
Хммм, а как насчет этого? Просто понять: d
import re
def WordsInText(text, words):
found = []
for index, item in enumerate(words):
if (re.search(f'{item}', text, re.IGNORECASE) is not None):
found.append(item)
return found
Расширение предложения @David Eisenstat для реализации этого с использованием алгоритма aho-corasick. Я нашел простой модуль Python ( pyahocorasic ), который может сделать это.
Вот как будет выглядеть код для примера, приведенного в вопросе.
import ahocorasick
def find_words(list_words, text):
A = ahocorasick.Automaton()
for key in list_words:
A.add_word(key, key)
A.make_automaton()
result = []
for end_index, original_value in A.iter(text):
result.append(original_value)
return result
list_words = ['red', 'hello', 'how are you', 'hey', 'deployed']
text = 'hello, This is shared right? how are you doing tonight'
print(find_words(list_words, text))
Теоретически обоснованная версия того, что вы пытаетесь сделать, называется Ахо-Корасик . Реализация суффиксных ссылок является довольно сложной задачей IIRC, так что вот алгоритм, который просто использует три.
Мы употребляем текст по буквам. Мы всегда поддерживаем набор узлов в дереве, где может быть проход. Первоначально этот набор состоит только из корневого узла. Для каждой буквы мы перебираем узлы в наборе, спускаясь по новой букве, если это возможно. Если получающийся узел совпадает, замечательно, сообщите об этом. Независимо от этого, поместите его в следующий набор. Следующий набор также содержит корневой узел, так как мы можем начать новое сопоставление в любое время.
Вот моя попытка быстрой реализации на Python (без проверки, без гарантии и т. Д.).
class Trie:
def __init__(self):
self.is_needle = False
self._children = {}
def find(self, text):
node = self
for c in text:
node = node._children.get(c)
if node is None:
break
return node
def insert(self, needle):
node = self
for c in needle:
node = node._children.setdefault(c, Trie())
node.is_needle = True
def count_matches(needles, text):
root = Trie()
for needle in needles:
root.insert(needle)
nodes = [root]
count = 0
for c in text:
next_nodes = [root]
for node in nodes:
next_node = node.find(c)
if next_node is not None:
count += next_node.is_needle
next_nodes.append(next_node)
nodes = next_nodes
return count
print(
count_matches(['red', 'hello', 'how are you', 'hey', 'deployed'],
'hello, This is shared right? how are you doing tonight'))
Если вы стремитесь к более быстрому коду, который зависит от текстового окна, вы можете пойти на поиски по множеству, чтобы ускорить процесс. Если возможно, замените список поиска на набор, а затем найдите все возможные окна в тексте, которые будут использоваться для поиска.
def getAllWindows(L):
tracker = set()
for w in range(1, len(L)+1):
for i in range(len(L)-w+1):
sub_window = L[i:i+w]
if sub_window not in tracker:
tracker.add(sub_window)
yield sub_window
lookup_list = ['red', 'hello', 'how are you', 'hey', 'deployed']
lookup_set = set(lookup_list)
text = 'hello, This is shared right? how are you doing tonight'
result = [sub_window for sub_window in getAllWindows(text) if sub_window in lookup_list]
print(result)
#Output:
['red', 'hello', 'how are you']