#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']
Комментариев нет:
Отправить комментарий