$
匹配在一行的末尾,该行被定义为字符串的结尾,或者后跟换行符的任何位置。
但是,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 '
答案 0 :(得分:3)
无法重新定义锚定行为。
要将//
与CR和LF之后的任意数量的字符匹配,请使用带有[^\r\n]
量词的否定字符类*
:
L = re.findall(rb'//[^\r\n]*', input)
请注意,此方法不需要使用re.M
和re.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|$)