Python2.7 mmap超过两行与正则表达式

时间:2013-04-21 08:57:57

标签: python regex python-2.7 mmap

以下是txt文件的内容:

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec
egestas, enim et consectetuer ullamcorper, lectus ligula rutrum leo, a
elementum elit tortor eu quam. Duis tincidunt nisi ut ante. Nulla
facilisi. Sed tristique eros eu libero. Pellentesque vel arcu. Vivamus
purus orci, iaculis ac, suscipit sit amet, pulvinar eu,
lacus. Praesent placerat tortor sed nisl. Nunc blandit diam egestas
dui. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Aliquam viverra fringilla
leo. Nulla feugiat augue eleifend nulla. Vivamus mauris. Vivamus sed
mauris in nibh placerat egestas. Suspendisse potenti. Mauris massa. Ut
eget velit auctor tortor blandit sollicitudin. Suspendisse imperdiet
justo.

这是我的代码:

import mmap
import re
import contextlib

pattern = re.compile(r'[\S\s]{5,15}elementum......',
                     re.DOTALL | re.IGNORECASE | re.MULTILINE)

with open('lorem.txt', 'r') as f:
    with contextlib.closing(mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)) as m:
        for match in pattern.findall(m):
            print match.replace('\n', ' ')

打印无法包含前一行中的任何内容,即使我告诉程序删除换行符并且我在所有内容上都匹配。如何匹配示例文件前一行的文本?

output

1 个答案:

答案 0 :(得分:2)

您的屏幕截图表明您使用的是Windows。对于\r\n中的Windows行结尾(lorem.txt),输出变为" rutrum leo, a\r elementum elit "\r(回车)导致光标跳回到行的开头,因此第一部分被第二部分覆盖:

$ python foo.py | od -tc
0000000   r   u   t   r   u   m       l   e   o   ,       a  \r       e
0000020   l   e   m   e   n   t   u   m       e   l   i   t      \n
0000037

要使代码与平台无关,请使用os.linesep代替'\n'

另一种选择是使用常规文件读取功能而不是mmap,并指定模式'r'(假设平台本地行结尾)或'rU'(接受任何{ {1}},\r\r\n)。这样可以确保所有行结尾自动转换为\n