【问题标题】:What does the "s!" operator in Perl do?"s!" 是什么意思Perl 中的操作符呢?
【发布时间】:2009-08-08 12:53:43
【问题描述】:

我有这个 Perl sn-p 来自我正在翻译成 Python 的脚本。我不知道什么是“s!”操作员在做;某种正则表达式替换。不幸的是,在 Google 或 Stackoverflow 中搜索类似的运算符并没有产生很多有用的结果。

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

每一行在做什么?我想知道以防我再次遇到这个操作员。

那么,Python 中的等价语句是什么?

【问题讨论】:

    标签: python regex perl


    【解决方案1】:

    s!foo!bar! 与更常见的s/foo/bar/ 相同,只是 foo 和 bar 可以包含未转义的斜杠而不会引起问题。它的作用是用 bar 替换第一次出现的正则表达式 foo。带有 g 的版本替换所有出现。

    【讨论】:

    • Perl 借鉴了很多语言。它是从 sed 那里借来的。
    【解决方案2】:

    它的作用与$var =~ s/// 完全相同。即在 $var 变量中执行搜索和替换。

    在 Perl 中,您可以在 s 之后定义分隔符。为什么 ?因此,例如,如果您正在匹配“/”,您可以指定另一个分隔字符(在这种情况下为“!”),而不必转义或反引号您正在匹配的字符。否则你最终会得到(比如说)

    s/;/\//g;
    

    这有点令人困惑。

    Perlre 有更多相关信息。

    【讨论】:

      【解决方案3】:

      Perl 允许您为其许多构造选择分隔符。这样可以更轻松地查看诸如

      之类的表达式中发生了什么
      $str =~ s{/foo/bar/baz/}{/quux/};
      

      正如您所见,并非所有分隔符都具有相同的效果。括号字符(&lt;&gt;[]{}())在开头和结尾使用不同的字符。而?,当用作正则表达式的分隔符时,会导致正则表达式在对reset() 运算符的调用之间仅匹配一次。

      阅读perldoc perlop 会有所帮助(尤其是m/PATTERN/msixpogc?PATTERN?s/PATTERN/REPLACEMENT/msixpogce 上的部分)。

      【讨论】:

        【解决方案4】:

        s! 是“正确”s/// 运算符的语法糖。基本上,你可以用任何你想要的分隔符来代替'/'。

        至于每一行在做什么,第一行是匹配正则表达式&lt;foo&gt;.+?&lt;/foo&gt; 的出现,并用任何内容替换整个批次。第二个是匹配正则表达式; 并将其替换为/

        s/// 是替代运算符。它需要一个正则表达式和一个替换字符串。

        s/regex/replace string/;
        

        它支持大多数(全部?)正常的正则表达式开关,它们以正常的方式使用(通过将它们附加到运算符的末尾)。

        【讨论】:

          【解决方案5】:

          s 是替换运算符。通常它是s/foo/bar/ 的形式,但您可以将 // 分隔符替换为其他一些字符,例如 !。使用其他分隔符可能会使处理路径等内容变得更加容易,因为您不需要转义路径分隔符。

          更多信息请参见manual page

          您可以在 re-module 中找到类似的 python 功能。

          【讨论】:

            【解决方案6】:

            s 是替换运算符。通常这使用'/'作为分隔符:

            s/foo/bar/
            

            ,但这不是必需的:许多其他字符可以用作分隔符。在这种情况下, '!'已被用作分隔符,大概是为了避免在要替换的实际文本中转义“/”字符。

            在您的具体情况下,第一行删除匹配“.+?”的文本;即它会删除带有或不带有内容的“foo”标签。

            第二行替换所有';'带有 '/' 字符的字符,全局(所有出现)。

            python等效代码使用re模块:

            f=re.sub(searchregx,replacement_str,line)
            

            【讨论】:

            • "...它会删除带有或不带有内容的 'foo' 标签。"不完全——它删除包含至少一个字符的'foo'标签。但是,+1 用于实际显示一些 Python 代码。
            • @pilcrow:嗯,感谢您的澄清。这 '?'那么这里似乎是多余的。我假设'.+?会像“(。+)?”一样工作。但事实并非如此。
            • '.+?'意思是“一个或多个,但尽可能少,同时仍然得到匹配”。与 '.+' 相反,它会尽可能匹配。
            【解决方案7】:

            python 的等价物是使用re 模块。

            【讨论】:

              猜你喜欢
              • 2011-09-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-11-22
              • 2018-03-05
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多