неверное выражение / пропущенное имя группы - PullRequest
1 голос
/ 21 марта 2020

Я использую python 2.7.17 и пытаюсь выполнить некоторые манипуляции с регулярными выражениями. Все работало до тех пор, пока я не столкнулся со следующей ошибкой:

Traceback (most recent call last):
  File "latex/latex.py", line 130, in <module>
    contents = re.sub(re.escape(i),img,contents, 0, re.MULTILINE)
  File "/usr/lib/python2.7/re.py", line 155, in sub
    return _compile(pattern, flags).sub(repl, string, count)
  File "/usr/lib/python2.7/re.py", line 286, in _subx
    template = _compile_repl(template, pattern)
  File "/usr/lib/python2.7/re.py", line 273, in _compile_repl
    raise error, v # invalid expression
sre_constants.error: missing group name

Я не знаю, что не так, потому что я на самом деле экранирую строку перед тем, как поместить ее в sub:

print "----"                                                                   
print i                                                                        
print re.escape(i)                                                             
print img                                                                      
contents = re.sub(re.escape(i),img,contents, 0, re.MULTILINE)

Вот что выдают операторы print:

----
$$n \in \Z_{\geq 0}$$
\$\$n\ \\in\ \\Z\_\{\\geq\ 0\}\$\$
<img class="latex inline" src="{filename}/images/latex-cache/symmetric-functions.md827a2321d2328298b1d5789840928039.png" /><!--n \in \Z_{\geq 0}-->

Как видите, он правильно экранирует строку, но по какой-то причине выдает ошибку. Я не знаю, в чем ошибка, потому что все статьи, которые я могу найти (например, ошибка регулярного выражения: ошибка повышения, v # недопустимое выражение ), не экранируют строку.

Любая помощь будет признателен.

Редактировать

Содержимое содержимого извлекается из файла. Я отредактировал скрипт, чтобы также распечатать содержимое. Вот что я имею в содержании:

<div class="content">
Let $$n \in \Z_{\geq 0}$$
</div>

Редактировать 2

Похоже, ошибка исходит от img. Когда я заменяю img чем-то другим, это работает отлично. Я смог сузить его до неудачи, когда:

img = "\g"

Должен ли я каким-либо образом избегать img?

Я также пытался:

img = "\\g"

и это также вызвало ту же ошибку.

1 Ответ

0 голосов
/ 22 марта 2020

Так получается, что причина в том, что \g является особенным в re.sub и используется для найденных групп (так же, как \1, \2, et c.) Так что это специальный символ. Чтобы обойти это, вам нужно сбежать от него, но, поскольку python - это весело, вам нужно убежать от побега. Другими словами, вы хотите:

contents = re.sub(re.escape(i),img.replace('\\','\\\\'),contents, 0, re.MULTILINE)

Для более подробного объяснения вы можете проверить ответы в: Python Regex escape-оператор \ in замены и необработанные строки

...