Python регулярное выражение не находит определенного шаблона - PullRequest
1 голос
/ 11 января 2020

Я пытаюсь проанализировать латексный код из html кода, который выглядит следующим образом:

string = " your answer is wrong! Solution: based on \((\vec{n_E},\vec{g})= 0 \) and \(d(g,E)=0\) beeing ... "

Я хочу заменить весь латексный код на вывод функции, которая принимает латексный код в качестве аргумента , (Поскольку существует проблема с поиском правильного шаблона, функция extract возвращает на данный момент пустую строку)

Я пытался:

latex_end = "\)"
latex_start = "\("    
string = re.sub(r'{}.*?{}'.format(latex_start, latex_end), extract, string)

Результат:

your answer is wrong! Solution: based on \= 0 \) and \=0\) beeing ...

Ожидаемый

your answer is wrong! Solution: based on and beeing ...

Есть идеи, почему он не находит образец? Есть ли способ реализовать это?

Ответы [ 2 ]

1 голос
/ 11 января 2020

Вы должны использовать необработанную строку для определения string, поскольку \v интерпретируется как специальный символ.

import re

string = r" your answer is wrong! Solution: based on \((\vec{n_E},\vec{g})= 0 \) and \(d(g,E)=0\) beeing ... "


string = re.sub(r'\\\(.*?\\\)', '', string))
print(string)

Печать:

 your answer is wrong! Solution: based on  and  beeing ...

Если вы необходимо иметь переменные для начала и конца:

latex_end = r"\\\)"
latex_start = r"\\\("    
string = re.sub(r'{}.*?{}'.format(latex_start, latex_end), '', string)
print(string)
1 голос
/ 11 января 2020

Это из-за обратной косой черты, служащей escape-символами в Python. Это делает обработку таких ситуаций очень сложной. Ниже приведены два быстрых способа сделать эту работу:

import re

extract = lambda a: ""

# Using no raw components
string = " your answer is wrong! Solution: based on \((\vec{n_E},\vec{g})= 0 \) and \(d(g,E)=0\) beeing ... "
latex_bounds = ("\\\(", "\\\)\)")
print(re.sub('{}.*?{}'.format(*latex_bounds), extract, string))

# Using all raw components (backslashes mean nothing, but not really)
string = r"%s" % string
latex_bounds = (r"\\\(", r"\\\)")
print(re.sub(r'{}.*?{}'.format(*latex_bounds), extract, string))
...