python - $ Windows换行符号(Python字节正则表达式)

原文 标签 python regex

$匹配行尾,行尾定义为字符串的结尾或后跟换行符的任何位置。
但是,windows newline标志包含两个字符'\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 '

最佳答案

无法重新定义锚定行为。
若要将a//与后面除cr和lf以外的任意数量的字符匹配,请使用带[^\r\n]量词的否定字符类*

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

注意,这种方法不需要使用re.Mre.S标志。
或者,您可以在\r?之前添加$,并将此部分放在一个积极的展望中(同时,您将使用*?作为一个懒惰的量词):
rb'//.*?(?=\r?$)'

使用lookahead的关键是.本身是一种lookahead,因为它并不真正使用$字符。因此,我们可以安全地把它放在一个前瞻性的可选\n
也许这不是相关的,因为它来自AA>,但我认为Python也一样。
注意\r匹配$但不匹配\n(回车和换行字符的组合,或\r\n)。要匹配CR/LF字符组合,请在正则表达式模式中包含CR/LF
在pcre中,可以使用MSDN覆盖$anchor的默认行为,但在python中不能。

相关文章:

regex - 正则表达式在同一行上重复的单词

python - 您如何在词典列表中查找出现次数

python - 向数据添加更多样本点

python - 用于从电子邮件主题中删除“FWD”,“RE”等的正则表达式/代码

python - 提取匹配字符串的最快方法