/ / Використання формату .format для використання змінної в regex findall об'єкті. Python - регулярний вираз, рядок, змінні, формат, findall

Використовуйте .формат для використання змінної в regex findall об'єкті. Python - регулярний вираз, рядок, змінні, формат, findall

Я бачив деякі приклади тут, але це не відповідало моєму питанню: Регулярний вираз Python findall з змінною

Я намагаюся використовувати змінну замість 9, але я не можу це з'ясувати

value = 9
ORF = re.findall(r"ATG(?:(?!TAA|TAG|TGA)…){  value  ,}?(?:TAA|TAG|TGA)",seq)
#obviously doesn"t work or i wouldn"t have made this post

Я намагався:

value = 9
ORF = re.findall(r"ATG(?:(?!TAA|TAG|TGA)…){  {}  ,}?(?:TAA|TAG|TGA)".format(value),seq)

але отримала помилку:

ValueError: Single "}" encountered in format string

тоді я спробував:

value = r"{}".format(9)
ORF = re.findall(r"ATG(?:(?!TAA|TAG|TGA)...){value,}?(?:TAA|TAG|TGA)",seq)

і не помилився, але він не працював, коли я дивився вниз по течії

Як я можу отримати цю змінну для роботи в моєму регулярному виразі?

Відповіді:

1 для відповіді № 1

Python скаржиться, що є й інші { і } у вашому рядку, який не використовується для форматування, і він не знає, як визначити різницю. У рядку формату фігурні дужки вислизаються шляхом подвоєння їх.

Вам також потрібно уникнути будь-яких символів регулярних виразів у вашому value.

Так, можливо:

ORF = re.findall(
r"ATG(?:(?!TAA|TAG|TGA)…){{{},}}?(?:TAA|TAG|TGA)"
.format(re.escape(value)),
seq)

Однак у такому випадку я сумніваюся, що хтось звинуватив вас у використанні %форматування або хороша стара струнка concatenation замість :)