Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Ошибка ValueError: unsupported format character 'b' (0x62) at index 8 при использовании переменной в регулярном выражении

#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']

Комментариев нет:

Отправить комментарий