我从脚本中获取了这个Perl片段,我正在将其翻译成Python。我不知道“s!”操作员正在做;某种正则表达式替换。不幸的是,搜索谷歌或Stackoverflow这样的运营商并没有产生很多有用的结果。
$var =~ s!<foo>.+?</foo>!!;
$var =~ s!;!/!g;
每条线路在做什么?我想知道如果我再次遇到这个操作员。
而且,Python中的等效语句是什么?
答案 0 :(得分:15)
s!foo!bar!
与更常见的s/foo/bar/
相同,除了foo和bar可以包含未转义的斜杠而不会导致问题。它的作用是,用bar替换正则表达式foo的第一次出现。带有g的版本替换了所有出现的内容。
答案 1 :(得分:13)
它与$var =~ s///
完全相同。即在$var
变量中执行搜索和替换。
在Perl中,您可以在s
之后定义分隔符。为什么?因此,例如,如果您匹配'/',则可以指定另一个分隔符(在这种情况下为'!'),而不必转义或回退您匹配的字符。否则你最终会(比如说)
s/;/\//g;
这有点令人困惑。
Perlre有更多相关信息。
答案 2 :(得分:10)
Perl允许您为其许多构造选择分隔符。这样可以更轻松地查看
等表达式中发生的情况$str =~ s{/foo/bar/baz/}{/quux/};
正如您所看到的,并非所有分隔符都具有相同的效果。包围字符(<>
,[]
,{}
和()
)在开头和结尾使用不同的字符。 ?
用作正则表达式的分隔符时,会导致正则表达式在调用reset()
运算符之间仅匹配一次。
您可能会发现阅读perldoc perlop
(特别是m/PATTERN/msixpogc
,?PATTERN?
和s/PATTERN/REPLACEMENT/msixpogce部分)会很有帮助。
答案 3 :(得分:3)
是替代算子。通常它采用s/foo/bar/
的形式,但您可以将!等其他字符替换为//分隔符。使用其他分隔符字符可能会使路径等事情变得更容易,因为您不需要转义路径分隔符。
有关详细信息,请参阅manual page。
您可以在re-module中找到类似的python功能。
答案 4 :(得分:2)
s
是替换运算符。通常,这使用'/'作为分隔符:
s/foo/bar/
,但这不是必需的:许多其他字符可以用作分隔符。在这种情况下, '!'已被用作分隔符,大概是为了避免需要转义实际文本中的'/'字符进行替换。
在您的具体情况下,第一行删除与'。+?'匹配的文字;即删除带有或不带内容的'foo'标签。
第二行替换所有';'带有'/'字符的字符,全局(全部出现)。
python等效代码使用re
模块:
f=re.sub(searchregx,replacement_str,line)
答案 5 :(得分:2)
s!
是“正确的”s///
运算符的语法糖。基本上,你可以替换你想要的任何分隔符而不是'/'。
关于每一行的作用,第一行是匹配正则表达式<foo>.+?</foo>
的出现并用什么都不替换整个批次。第二个是匹配正则表达式;
并将其替换为/
。
s///
是替代运营商。它需要一个正则表达式和一个替换字符串。
s/regex/replace string/;
它支持大多数(全部?)正常的正则表达式开关,它们以正常方式使用(通过将它们附加到运算符的末尾)。
答案 6 :(得分:0)
python的等价物是使用re
模块。