#python #регулярные_выражения
Нужно найти в тексте некоторый текст, который находится между двумя символами (например "@") templateTest = 'ddddffs@rusjjd@sdsvvv@xcvdfb @' simvol = '@' def findReplasement(sourse, start, end): regular = re.compile('%a(.*?)%b' %(start,end), re.IGNORECASE) result = regular.findall(sourse) return result x = findReplasement(templateTest, simvol,simvol) print(x) Но в этом случае выдаётся ошибка: ValueError: unsupported format character 'b' (0x62) at index 8 При этом, если не использовать переменные, то всё работает: regular = re.compile('@(.*?)@', re.IGNORECASE) ['rusjjd', 'xcvdfb '] В чём ошибка?
Ответы
Ответ 1
Проблема в том, что во выражении '%a(.*?)%b' %(start,end) %b значит конверсию выражения типа integer (до двоичной системы), и вы во вызове функции findReplasement(templateTest, simvol,simvol) используете параметр simvol типа string. Нужно применить (дважды - тоже для %a) описатель формата %s для типа string - то значит, вместо regular = re.compile('%a(.*?)%b' %(start,end), re.IGNORECASE) используйте regular = re.compile('%s(.*?)%s' %(start,end), re.IGNORECASE) и вывод из вашей программы будет ['rusjjd', 'xcvdfb ']Ответ 2
Попробуйте так: In [88]: pat = re.compile(r'{}(.*?){}'.format(simvol,simvol), flags=re.I) In [89]: re.findall(pat, templateTest) Out[89]: ['rusjjd', 'xcvdfb ']Ответ 3
Чтобы найти все фрагменты текста между указанными границами start, end с помощью вашего регулярного выражения: import re def findall_inbetween(text, start, end): return re.findall('(?i)' + '(.*?)'.join(map(re.escape, [start, end])), text) re.escape() используется чтобы заэкранировать символы, которые являются специальными в регулярных выражениях. К примеру, . (точка) заменяется на \. (чтобы буквально точку найти, а не произвольный символ). Пример: >>> findall_inbetween('a@b@c@d@', *'@'*2) ['b', 'd']
Комментариев нет:
Отправить комментарий