Python字节正则表达式中的$ Windows换行符号

时间:2015-07-14 07:11:27

标签: python regex

$匹配在一行的末尾,该行被定义为字符串的结尾,或者后跟换行符的任何位置。

但是,Windows换行标志包含两个字符'\r\n',如何'$''\r\n'识别为bytes中的换行符?

这就是我所拥有的:

# Python 3.4.2
import re

input = b'''
//today is a good day \r\n
//this is Windows newline style \r\n
//unix line style \n
...other binary data... 
'''

L = re.findall(rb'//.*?$', input, flags = re.DOTALL | re.MULTILINE)
for item in L : print(item)

现在的输出是:

b'//today is a good day \r'
b'//this is Windows newline style \r'
b'//unix line style '

但预期输出如下:

the expected output:
b'//today is a good day '
b'//this is Windows newline style '
b'//unix line style '

3 个答案:

答案 0 :(得分:3)

无法重新定义锚定行为。

要将//与CR和LF之后的任意数量的字符匹配,请使用带有[^\r\n]量词的否定字符类*

L = re.findall(rb'//[^\r\n]*', input)

请注意,此方法不需要使用re.Mre.S标记。

或者,您可以在\r?之前添加$,并将此部分包含在正面预测中(同样,您将使用*?获得.懒惰量词):

rb'//.*?(?=\r?$)'

使用前瞻的要点是$本身是一种先行,因为它并没有真正消耗\n字符。因此,我们可以安全地使用可选\r进行预测。

也许这不是那么相关,因为它来自MSDN,但我认为它与Python相同:

  

请注意,$\n匹配,但与\r\n(回车符和换行符或CR/LF的组合)不匹配。要匹配CR/LF字符组合,请在正则表达式模式中包含\r?$

在PCRE中,您可以使用(*ANYCRLF), (*CR) and (*ANY)覆盖$ anchor的默认行为,但不能用Python。

答案 1 :(得分:1)

黑客,但......

re.findall(r'//.*?(?=\r|\n|(?!.))', input, re.DOTALL | re.MULTILINE)

这应该复制默认$锚点的行为(就在\r\n或字符串结尾之前)。

答案 2 :(得分:1)

我认为你也可以使用\v 垂直空间来匹配[\n\cK\f\r\x85\x{2028}\x{2029}]

要不将其包含在输出中,请使用lookahead//.*(?=\v|$)

Test at regex101.com