什么是“s!” Perl的运营商呢?

时间:2009-08-08 12:53:44

标签: python regex perl

我从脚本中获取了这个Perl片段,我正在将其翻译成Python。我不知道“s!”操作员正在做;某种正则表达式替换。不幸的是,搜索谷歌或Stackoverflow这样的运营商并没有产生很多有用的结果。

 $var =~ s!<foo>.+?</foo>!!;
 $var =~ s!;!/!g;

每条线路在做什么?我想知道如果我再次遇到这个操作员。

而且,Python中的等效语句是什么?

7 个答案:

答案 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模块。