У меня возникли проблемы с преобразованием этих perl-регулярных выражений в python, раньше я преобразовал более простые. Я действительно не понимаю модификаторы /s и /is, я знаю, что /g является глобальным.
Я также не знаю, что именно делает первый. Второй удаляет определенный тег li с сообщением в html файлах.
# First
$data =~ s/\]\((\/uploads\/.*?\.pdf)\)/\]\(ref\/\/\/docs$1\)/g;
# Second
$data =~ s/<li>.*?https:\/\/www\.example\.com.*?<\/li>/$test/is;
# What I think might work in python
data = re.sub('<li>.*?https:\/\/www\.example\.com.*?<\/li>/' + test, data, 1)
Первое регулярное выражение ничего не делает, кроме добавления ref///docs
к началу.
Объяснение:
/\]\((\/uploads\/.*?\.pdf)\)/g
\]
соответствует символу "]"\(
соответствует символу "(" \/
соответствует символу "/"uploads
символы "uploads" (с учетом регистра)\/
соответствует символу "/".*?
соответствует любому символу (кроме терминаторов строк)*?
Квантификатор - совпадение между нулевым и неограниченным временным интервалом, насколько это возможно, расширение по мере необходимости (ленивое)\.
соответствует символу ".pdf
соответствует символам pdf (с учетом регистра)\)
соответствует символу) Глобальные флаги шаблонов
g
модификатор: глобальный. Все совпадения (не возвращаются после первого матча)Рассмотрим пример:
test_str = "](/uploads/something.pdf)"
Perl:
my $test_str = "](/uploads/something.pdf)";
$test_str =~ s/\]\((\/uploads\/.*?\.pdf)\)/\]\(ref\/\/\/docs$1\)/g;
питон:
test_str = "](/uploads/something.pdf)"
test_str = re.sub(r"\]\((\/uploads\/.*?\.pdf)\)", r"](ref///docs\1)", test_str)
Вывод печати test_str
после подстановки:
](ref///docs/uploads/something.pdf)
Я не знаю, что вы действительно хотите делать во втором регулярном выражении, но регулярное выражение perl говорит, чтобы заменить любой URL example.com на любой переменной $test
. Давайте поиграем:
Perl:
my $test = "test";
my $data = "<li>list 1 https://www.example.com/site </li>";
$data =~ s/<li>.*?https:\/\/www\.example\.com.*?<\/li>/$test/is;
питон:
data = "<li>list 1 https://www.example.com/site </li>";
test = "test"
data = re.sub(r"<li>.*?https:\/\/www\.example\.com.*?<\/li>", test, data, re.S|re.I)
Вывод печатных data
после подстановки:
test
Модификаторы:
i
означает игнорировать регистр (нечувствительный к регистру поиск)s
означает, что точка теперь будет соответствовать любому символу (включая новую строку)
/i
и/s
делают то же самое, что и в python, т. е. игнорируют регистр (/i
) и позволяют точка соответствовать всему, включая новую строку (/s
)./is
просто означает, что оба/i
и/s
применяются.