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

1

У меня возникли проблемы с преобразованием этих 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
    /i и /s делают то же самое, что и в python, т. е. игнорируют регистр ( /i ) и позволяют точка соответствовать всему, включая новую строку ( /s ). /is просто означает, что оба /i и /s применяются.
  • 0
    О, хорошо, я думаю, что я понял второй, используя это, но я все еще не особенно понимаю первый. У вас есть идея, как конвертировать его?
Показать ещё 4 комментария
Теги:

1 ответ

1

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

Объяснение:

/\]\((\/uploads\/.*?\.pdf)\)/g
  • \] соответствует символу "]"
  • \( соответствует символу "("
    1-я группа захвата (/uploads/.*?.pdf)
  • \/ соответствует символу "/"
  • 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 означает, что точка теперь будет соответствовать любому символу (включая новую строку)
  • 0
    Большое спасибо за всю информацию! Я не видел этого до сих пор, но я исправил первый, как 3 дня назад, и в итоге просто использовал BeautifulSoup для второго. Второй заменяет этот определенный тег <li> на $ test, который является пользовательским тегом <li>. Я перебрал все теги li в файле и, если его текст содержал определенный текст, я изменил его с помощью другого тега. Должен ли я изменить его на регулярное выражение, будет ли он более эффективным или это не имеет значения?
  • 0
    Регулярные выражения чаще всего тяжелы в системе, мы должны избегать этого (сложные регулярные выражения).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню