无法理解Perl中的正则表达式修饰符以转换为python

时间:2018-10-16 16:53:01

标签: python regex perl

我在将这些perl regex转换为python时遇到了麻烦,之前我已经转换了一些简单的正则表达式。我不太了解修饰符/ s和/ is,我知道/ g是全局的。

我也不知道第一个到底是做什么的。第二个删除带有HTML文件中消息的特定li标签。

# 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 :(得分:1)

第一个正则表达式不执行任何操作,只是将ref///docs附加到开头。

说明

/\]\((\/uploads\/.*?\.pdf)\)/g
  • \]与字符“]”匹配
  • \(与字符“(”匹配
    第一捕获小组(/ uploads /.* ?. pdf)
  • \/与字符“ /”匹配
  • 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;

python:

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正则表达式表示要将example.com的任何URL替换为任何变量$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表示点现在可以匹配任何字符(包括换行符)