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