Возникают проблемы с пониманием модификаторов регулярных выражений в Perl для преобразования в Python - PullRequest
0 голосов
/ 16 октября 2018

У меня проблемы с преобразованием этих регулярных выражений 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)

1 Ответ

0 голосов
/ 19 октября 2018

Первое регулярное выражение ничего не делает, но добавляет ref///docs в начало.

Объяснение :

/\]\((\/uploads\/.*?\.pdf)\)/g
  • \] соответствует символу "]"
  • \( соответствует символу"("
    1st Capturing Group (/uploads/.*?.pdf)
  • \/ соответствует символу "/"
  • uploads соответствует символу "uploads" (с учетом регистра)
  • \/ соответствует символу "/"
  • .*? соответствует любому символу (кроме ограничителей строки)
  • *? Quantifier - соответствует нулюи неограниченное количество раз, как можно меньше, расширяясь по мере необходимости (ленивый)
  • \. соответствует символу ".
  • pdf соответствует символам pdf (с учетом регистра)
  • \) соответствует символу)

Глобальные флаги шаблона

  • g модификатор: global. Все совпадения (не возвращаются после первого совпадения)

Рассмотрим пример :

test_str = "](/uploads/something.pdf)"

perl:

my $test_str = "](/uploads/something.pdf)";
$test_str =~ s/\]\((\/uploads\/.*?\.pdf)\)/\]\(ref\/\/\/docs$1\)/g;

python:

test_str = "](/uploads/something.pdf)"
test_str = re.sub(r"\]\((\/uploads\/.*?\.pdf)\)", r"](ref///docs\1)", test_str)

Output of print 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;

python:

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 означает, что точка теперь будет соответствовать любому символу (включая символ новой строки)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...