Python3中的原始字符串,正则表达式

时间:2018-04-15 11:09:30

标签: python regex python-3.x

我开始学习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',我无法理解,因为它没有双反斜杠...... 你能解释一下这个谜吗?

2 个答案:

答案 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

这就是它,这里没有神秘感。