Я не могу комментировать, но только некоторые мысли:
Из того, что вы опубликовали, похоже, что материал, который вы хотите искать, всегда одинаков, поэтому почему бы просто не присоединиться к нимв большом регулярном выражении и скомпилируйте это большое регулярное выражение перед запуском цикла.
Таким образом, вы не компилируете регулярное выражение для каждой итерации, а только один раз.
например
import re
cases = [] # 100 000 case numbers from db
suffixes = [] # 500 diffrent suffixes to try from db
texts = [] # 100 000 for the beginning - will become less after initial run
bre1 = re.compile('|'.join(suffixes), re.IGNORECASE)
bre2 = re.compile('|'.join([re.escape(c) for c in cases]), re.IGNORECASE)
def process_item(text: str) -> str:
x = re.findall(bre1, text)
for match in x:
# process the matches, where I need to know which suffix matched
pass
x = re.findall(bre1, text)
for match in x:
# process the matches, where I need to know which number matched
pass
return text
for text in texts:
processed = process_item(text)
Если бы вы могли надежно найти case number
в text
(например, если перед ним есть какой-то идентификатор), было бы лучше найти номер дела с помощью re.search
и иметь номера дел в set
и проверитьза членство в этом наборе.
например
cases = ["123", "234"]
cases_set = set(cases)
texts = ["id:123", "id:548"]
sre = re.compile(r'(?<=id:)\d{3}')
for t in texts:
m = re.search(sre, t)
if m and m.group() in cases_set:
# do stuff ....
pass