Вставка строки из массива в регулярное выражение - PullRequest
0 голосов
/ 27 октября 2019

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

Вот что у меня есть:

results = []
arr = ["CAT", "DOG", "BIRD"]

for i in arr:
    patt='(i)+'
    string= contents
    p=re.compile(patt)
    replen=[sp.end()-sp.start() for sp in p.finditer(string)]
    results.append(max(replen)/(len(patt)-3))
  1. string = contents - у меня есть текстовый файл, содержащий строку, с которой я выполняю регулярное выражение. Это сохраняется в содержании. Если я печатаю (строку), она правильно выводит строку txt файла

  2. Я пытаюсь сделать так, чтобы программа посмотрела на строку, сохраненную в содержимом, а затем увидела, сколько раз "CAT "найден последовательно (например, ABCATCATCATDEFHGICAT = 3). Я хочу сохранить это число в результатах, затем сделать то же самое снова с DOG и BIRD и так далее.

  3. Если я потеряю цикл for и вручную введу CAT или DOG или что-то еще в patt='(i)+', все работает нормально, но мне нужно, чтобы он перебирал каждую запись в массиве.

Минимальный воспроизводимый ответ:

results = []
arr = ["CAT", "DOG", "BIRD"]

patt='(CAT)+'
string= "ABCATCATCATCATDEFIJKCAT"
p=re.compile(patt)
replen=[sp.end()-sp.start() for sp in p.finditer(string)]
results.append(max(replen)/(len(patt)-3))

Вышеприведенное должно вставить 4 в массив результатов.

Ответы [ 2 ]

1 голос
/ 27 октября 2019

Используйте форматирование строки для построения шаблона.

arr = ["CAT", "DOG", "BIRD"]

for i in arr:
    patt = '({})+'.format(i)
    ...

Или с f-строками

arr = ["CAT", "DOG", "BIRD"]

for i in arr:
    patt = f'({i})+'
    ...
0 голосов
/ 27 октября 2019

Вы используете литерал i вместо переменной i. Если вы используете python> = 3.6, вы можете использовать fstrings и быстро позаботиться об этом.

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

results = []
arr = ["CAT", "DOG", "BIRD"]

for i in arr:
    patt=f'({i})+'
    string= contents
    p=re.compile(patt)
    replen=len([sp for sp in p.finditer(string)])
    results.append(replen)
...