我开始学习Python3,目前我完全迷失在'正则表达式'中。为了理解原始字符串,我写了这段代码:
import re
pattern='\\n'
c='qwerty\. i am hungry. \n z'
d=r'qwerty\. i am hungry. \n z '
print(c)
print(d+'\n\n\n')
for a in (c,d,):
if re.search(pattern,a):
print('"{0}" contains "{1}" \n'.format(a, pattern))
else:
print('"{0}" does not contain "{1}" \n'.format(a, pattern))
输出是:第一个字符串包含模式,第二个字符串不包含模式。但是,一旦我在模式中引入了一个小的改变:
import re
pattern=r'\\n'
c='qwerty\. i am hungry. \n z'
d=r'qwerty\. i am hungry. \n z '
print(c)
print(d+'\n\n\n')
for a in (c,d,):
if re.search(pattern,a):
print('"{0}" contains "{1}" \n'.format(a, pattern))
else:
print('"{0}" does not contain "{1}" \n'.format(a, pattern))
结果反转。第二个字符串包含r'\\n'
,我无法理解,因为它没有双反斜杠......
你能解释一下这个谜吗?
答案 0 :(得分:1)
原始字符串实质上告诉系统读取以下字符串中的反斜杠它们是什么 - 反斜杠。所以,
print(r'hi\nhi')
打印hi\nhi
。
但是,系统会将非原始字符串中的反斜杠视为一种方法来转义以下字符。因此,
print('hi\nhi')
打印:
hi
hi
因此,非原始字符串中的\n
成为换行符。
在您的代码中,pattern
包含一个带换行符的字符串,不是反斜杠,n 。如果您使用pattern = r'\n'
,pattern
将包含反斜杠和n,但不包含换行符
因此,在字符串中搜索\\n
,实际上告诉系统退出\
(因此,它会搜索反斜杠),然后是n
。
首先,让我们澄清一下:c
包含换行符,d
包含\n
。这可以通过打印字符串来验证。
搜索'\\n'
时,正则表达式模式会搜索换行符。因此,c
匹配,但d
不匹配。
当pattern = '\n'
然后c
匹配,但d
没有。
当pattern = r'\\n'
时,d
匹配,但c
不匹配。
答案 1 :(得分:0)
根据插值规则:
'\n'
成为ascii字节0x0A;这适用于您要匹配的第一个字符串
r'\n'
成为文字\n
,即\
后跟n
;这适用于要匹配的第二个字符串。
'\\n'
成为文字\n
;这适用于您的第一个模式字符串
r'\\n'
成为文字\\n
;这适用于第二个模式字符串。
执行匹配时,re.search
对模式进行了另一轮插值:
文字\n
变成ascii字节0x0A(第一个模式)
文字\\n
变成文字\n
(第二种模式)
所以最后你的第一个字符串匹配第一个模式,因为它们都包含ascii 0x0A,
第二个字符串与第二个模式匹配,因为它们都包含文字\n
。
这就是它,这里没有神秘感。