【问题标题】:How to match a newline character in a raw string?如何匹配 Python 原始字符串中的换行符
【发布时间】:2013-01-19 07:36:56
【问题描述】:

我对 Python 原始字符串有点困惑。我知道如果我们使用原始字符串,那么它会将'\' 视为正常的反斜杠(例如r'\n' 将是\n)。但是,我想知道如果我想匹配原始字符串中的换行符怎么办。我试过r'\\n',但没用。

有人对此有什么好主意吗?

【问题讨论】:

  • 我们在这里谈论什么样的比赛?您是在谈论正则表达式匹配,还是只是 if ... in my_raw_string
  • 很抱歉让您感到困惑。我说的是正则表达式。

标签: python regex rawstring


【解决方案1】:

你也可以使用 [\r\n] 来匹配新行

【讨论】:

    【解决方案2】:
    def clean_with_puncutation(text):    
        from string import punctuation
        import re
        punctuation_token={p:'<PUNC_'+p+'>' for p in punctuation}
        punctuation_token['<br/>']="<TOKEN_BL>"
        punctuation_token['\n']="<TOKEN_NL>"
        punctuation_token['<EOF>']='<TOKEN_EOF>'
        punctuation_token['<SOF>']='<TOKEN_SOF>'
      #punctuation_token
    
    
    
        regex = r"(<br/>)|(<EOF>)|(<SOF>)|[\n\!\@\#\$\%\^\&\*\(\)\[\]\
               {\}\;\:\,\.\/\?\|\`\_\\+\\\=\~\-\<\>]"
    
    ###Always put new sequence token at front to avoid overlapping results
     #text = '<EOF>!@#$%^&*()[]{};:,./<>?\|`~-= _+\<br/>\n <SOF>\ '
        text_=""
    
        matches = re.finditer(regex, text)
    
        index=0
    
        for match in matches:
         #print(match.group())
         #print(punctuation_token[match.group()])
         #print ("Match at index: %s, %s" % (match.start(), match.end()))
            text_=text_+ text[index:match.start()] +" " 
                  +punctuation_token[match.group()]+ " "
            index=match.end()
        return text_
    

    【讨论】:

      【解决方案3】:

      在正则表达式中,您需要指定您处于多行模式:

      >>> import re
      >>> s = """cat
      ... dog"""
      >>> 
      >>> re.match(r'cat\ndog',s,re.M)
      <_sre.SRE_Match object at 0xcb7c8>
      

      注意re\n(原始字符串)转换为换行符。正如您在 cmets 中指出的那样,您实际上并不 需要 re.M 来匹配它,但它确实有助于更直观地匹配 $^

      >> re.match(r'^cat\ndog',s).group(0)
      'cat\ndog'
      >>> re.match(r'^cat$\ndog',s).group(0)  #doesn't match
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      AttributeError: 'NoneType' object has no attribute 'group'
      >>> re.match(r'^cat$\ndog',s,re.M).group(0) #matches.
      'cat\ndog'
      

      【讨论】:

      • 感谢您的回答@mgilson!我也想知道为什么我们需要指定多行模式。我尝试在没有它的情况下进行匹配,例如“re.match(r'cat\ndog', s)”,它仍然有效。
      • @user1783403 -- 你是对的。我应该更多地阅读文档。指定re.M 得到^$ 以更直观地匹配。
      • 有什么方法可以让$ 匹配“不太直观” - 即在字符串末尾匹配 only?我不希望它在\n 之前匹配
      • 使用 re.DOTALL 选项匹配\n
      【解决方案4】:

      最简单的答案是不使用原始字符串。您可以使用 \\ 转义反斜杠。

      如果您在某些段中有大量反斜杠,那么您可以根据需要连接原始字符串和普通字符串:

      r"some string \ with \ backslashes" "\n"
      

      (Python 自动连接字符串文字,它们之间只有空格。)

      请记住,如果您在 Windows 上使用路径,最简单的选择就是使用正斜杠 - 它仍然可以正常工作。

      【讨论】:

      • @mgilson 我只是在检查它是否适用于原始字符串和普通字符串,因为这不是我做过的事情。照原样编辑。它实际上要好一些,因为我相信连接是在解析时完成的,而不是在执行时完成的。
      • 是的,我以前也从未真正检查过:)
      • 我也不确定是否投反对票。我想有人可能已经在正则表达式的上下文中看到了关于 OP 想要这个的评论,并决定这不适用。无论如何,FWIW,我投了赞成票,因为我喜欢字符串的自动连接(原始和正常)
      • 是的,有了这些信息,帖子有点过时了,但我发帖时没有。嗯,发生了无法解释的反对票。
      猜你喜欢
      • 1970-01-01
      • 2019-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-21
      • 2018-01-23
      • 2014-05-17
      相关资源
      最近更新 更多