正则表达式:从文本文件中提取记录

时间:2015-11-08 06:16:09

标签: python regex

我正在学习正则表达式,我想从文件中提取所有记录。该文件包含多个id-<'sequence of multiline special characters, digits and alphabets'>形式的记录。

我写了以下正则表达式,它返回除最后一条记录之外的所有内容。我知道问题是最后一条记录没有拖尾id-,因为它遇到了eof。

解决此问题的最有效方法是什么?

with open(filename, 'r+') as f:
    data = mmap.mmap(f.fileno(), 0)
    for result in re.findall('id-(.*?)id-', data, re.S):
        print result

编辑:每条记录还有一个父ID字段:

id-c0nv*&*parentid-t1_cwi2*&*auth-author*&*body-something something. 

答案:re.findall(r'(?si)\ bid - (。*?)(?:\ bid- | $)',data,overlapped = True) 我使用了正则表达式模块,因为我想要重叠匹配。

2 个答案:

答案 0 :(得分:2)

另一种选择可能是积极的看法。 我们的文件内容是

dsafdsfid-<'sequence of multiline special characters, digits and alphabets'>id-
sadddid-sdlkllkd   87   id-dfdssdfdsf

alksdlid-lklasdl

正则表达式

(?<=id-)(.*?)(?=id-|$)

正则表达式的解释

capture all between id- and id- or string end

尝试以下

import re
mtches = re.findall(r'(?<=id-)(.*?)(?=id-|$)',open(r"C:\Users\Winrock\Desktop\ids.txt",'rb').read())
print mtches

打印

["<'sequence of multiline special characters, digits and alphabets'>", 'sdlkllkd 87   ', 'lklasdl']

答案 1 :(得分:1)

您可以修改正则表达式以查找子模式或字符串的结尾:

id-(.*?)(?:id-|$)