0

这是一个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', ' ')

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

输出

4

1 回答 1

2

您的屏幕截图表明您使用的是 Windows。在 Windows 行尾 ( \r\n) 中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'(接受任何\r,\r\n\n)。这可确保所有行尾都自动转换为\n

于 2013-04-21T09:27:02.570 回答