математическая формула регулярного выражения catch, например: $ inline $ in python или javascript - PullRequest
0 голосов
/ 04 мая 2020

У меня есть строковый ввод (содержимое файла уценки), где каждая математическая формула заключена в $$.

Пример:

$$ stand alone $$

$$ stand 
alone $$


And there $$ inline $$. 

$$ inline 2 $$ some text also. 

Я бы хотел изменить формулы inline на $.

Я пытался поймать с помощью регулярных выражений, но пока не могу найти правильное решение.

Этот один пример ловит каждый $$, но не различает встроенные и автономные:

re.findall(r'\$\$([^\$]+?)\$\$',  txt)

Ответы [ 4 ]

2 голосов
/ 04 мая 2020

Во-первых, вы можете использовать .*+ вместо [^$]+. Он не фиксирует паттерны, которые включают \n.

. Затем поставьте «не в начале строки - (?!^)» и «не в конце строки - (?<!$)». И используйте |, чтобы объединить их.

print(re.findall(r'(?m)(?!^)\$\$(.+?)\$\$|\$\$(.+?)\$\$(?<!$)', txt))

напечатает:

[(' inline ', ''), ('', ' inline 2 ')]

(?m) обозначает флаг «многострочный».

Если вы хотите заменить для REPLACED!!,

print(re.sub(r'(?m)(?!^)\$\$(.+?)\$\$|\$\$(.+?)\$\$(?<!$)', '$$ REPLACED!! $$', text))

вывод:

$$ stand alone $$

$$ stand 
alone $$


And there $$ REPLACED!! $$. 

$$ REPLACED!! $$ some text also.

Если вам не нравится, что номер группы не соответствует,

Вы можете использовать условный шаблон :

print(re.findall(r'(?m)(.+)?\$\$(.+?)\$\$(?(1)|.+)', text))

вывод:

[('And there ', ' inline '), ('', ' inline 2 ')]

Теперь номер целевой группы всегда равен 2.

1 голос
/ 04 мая 2020

Вы можете использовать упреждающий просмотр и просмотр, чтобы проверить, есть ли текст до или после формулы следующим образом:

re.findall(r'(?:(?<=(?: |\w))\$\$([^\n$]+?)\$\$)|(?:\$\$([^\n$]+?)\$\$(?=(?: |\w)))',  txt)

Это дает:

[(' inline ', ''), ('', ' inline 2 ')]

, которые вы можете узнать больше о взглядах вперед / назад здесь и тестировании ваших паттернов здесь .

Редактировать: удалено ненужное экранирование в [\n\$], как предлагается в комментарии Босоенга Чоя.

0 голосов
/ 04 мая 2020

Вы можете захватить отдельные формулы в группе захвата, окруженной якорями, и использовать чередование | с другой группой для захвата содержимого между встроенными формулами.

В замене поместите заднюю группу 1 и 2, где группа 2 окружена одним $

^(\$\$[\s\S]*?\$\$)$|(?<!\$)\$(\$[\s\S]*?\$)\$(?!\$)

Regex demo | Python демо

Пример кода

import re

pattern = r"^(\$\$[\s\S]*?\$\$)$|(?<!\$)\$(\$[\s\S]*?\$)\$(?!\$)"
test_str = ("$$ stand alone $$\n\n"
            "$$ stand \n"
            "alone $$\n\n"
            "And there $$ inline $$. ")

regex = re.compile(pattern, re.MULTILINE)
result = re.sub(
    regex,
    lambda x: x.group(2) if x.group(2) else x.group(1), test_str
)

if result:
    print (result)

Выход

$$ stand alone $$

$$ stand 
alone $$

And there $ inline $.
0 голосов
/ 04 мая 2020

Как насчет определения начала в регулярном выражении, добавив ^.

Как ^\$\$([^\$]+?)\$\$

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