Как использовать регулярное выражение, чтобы удалить все математические выражения в латексном файле - PullRequest
0 голосов
/ 13 февраля 2019

Предположим, у меня есть строка, которая состоит из части латексного файла.Как я могу использовать модуль Python Re для удаления любого математического выражения в нем?

Например:

text="This is an example $$a \text{$a$}$$. How to remove it? Another random math expression $\mathbb{R}$..."

Я бы хотел, чтобы моя функция возвращала ans="This is an example . How to remove it? Another random math expression ...".

Спасибовы!

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Обычно говорят, что регулярные выражения не могут сосчитать , что является неким простым способом описания проблемы, более формально обсуждаемой в Подсчет скобок с регулярным выражением .Посмотрите, что это означает.

Теперь, помня об этом, обратите внимание, что математические выражения LaTeX могут включать вложенные вложенные уравнения, которые могут включать дополнительные вложенные вложенные уравнения и т. Д.,Это аналогично проблеме определения, закрывает ли закрывающая скобка внутреннее выражение в скобках (как, например, в этом примере, где нет первого), или внешнюю скобку.Следовательно, регулярные выражения не будут достаточно мощными, чтобы справиться с полным общим случаем.

Если вы хотите выполнить неполное задание, вы можете создать регулярныйвыражение, которое находит $...$ и $$...$$.Вам нужно будет обратить внимание на конкретный язык регулярных выражений.Python по сути тот же, что и Perl.

Важно, что эти $ -матчеры будут полностью пропускать \begin{equation} ... \end{equation}, \begin{eqnarray} ... \end{eqnarray} и так далее.Мы уже отметили, что обработка синтаксического анализа выражений LaTeX с помощью простого распознавателя регулярных выражений неадекватна, поэтому, если вы хотите хорошо поработать, игнорируя при этом сложность низкоуровневой манипуляции TeX с типами токенов, где можно изменить любой отдельный символ код категории - вам понадобится более общий анализатор.Затем вы можете токенизировать \begin, {, } и слова и сопоставлять пары начала / конца.Вы также можете токенизировать $ и $$ и сопоставлять их.Поскольку синтаксические анализаторы могут считать точно так же, как регулярные выражения, вы можете сделать намного лучшую работу таким образом.

0 голосов
/ 13 февраля 2019

Попробуйте это регулярное выражение:

(\$+)(?:(?!\1)[\s\S])*\1

Нажмите для демонстрации

Код

Объяснение:

  • (\$+) - соответствует 1+ вхождений $ и захватывает его в группе 1
  • (?:(?!\1)[\s\S])*- соответствует 0+ вхождений любого символа, который не начинается с того, что было захвачено в Группе 1
  • \1 - снова сопоставляется с содержимым Группы 1

Заменить каждое совпадение напустая строка.

Как подсказывает @torek, мы не должны сопоставлять 3 или более последовательных $, следовательно, изменив выражение на (\${1,2})(?:(?!\1)[\s\S])*\1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...