如何匹配Python原始字符串中的新行字符

时间:2013-02-04 15:05:45

标签: python regex rawstring

我对Python原始字符串有点困惑。我知道如果我们使用原始字符串,那么它会将'\'视为正常的反斜杠(例如r'\ n'将是'\'和'n')。但是,我想知道如果我想匹配原始字符串中的新行字符。我试过r'\ n',但它不起作用。有人对此有一些好主意吗?

4 个答案:

答案 0 :(得分:25)

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

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

请注意re\n(原始字符串)转换为换行符。正如您在评论中指出的那样,实际上 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'

答案 1 :(得分:6)

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

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

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

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

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

答案 2 :(得分:0)

test <- data.frame(exp = c( rep("exp1" , 4) , rep("exp2" , 4), rep("exp3" , 4) , rep("exp4" , 5) ) , 
                   entries = c("abcd","efgh","ijkl","mnop", "qrst" , "uvwx" , "abcd","efgh","ijkl" , "qrst" , "uvwx", 
                               "yzab" , "yzab" , "cdef" , "mnop" , "uvwx" , "ghij"))

> test
    exp entries
1  exp1    abcd
2  exp1    efgh
3  exp1    ijkl
4  exp1    mnop
5  exp2    qrst
6  exp2    uvwx
7  exp2    abcd
8  exp2    efgh
9  exp3    ijkl
10 exp3    qrst
11 exp3    uvwx
12 exp3    yzab
13 exp4    yzab
14 exp4    cdef
15 exp4    mnop
16 exp4    uvwx
17 exp4    ghij

答案 3 :(得分:0)

您还可以使用[\ r \ n]匹配新行