匹配模式

时间:2016-03-16 10:39:11

标签: regex python-2.7 csv file-io

早安全,

我目前正在阅读一个采用以下形式的文本文件:

foo: example1
bar: example2
fizz: buzz
abra: cadabra

并以下列格式输出csv:

foo,bar,fizz,abra
example1,example2,buzz,cadabra

然而," abra"我的文本文件采用以下形式:

foo: example1
bar: example2
fizz: buzz
abra: cadabra
something else
another thing
(new line)
probably another thing
(new line)
some number

这个模式重复多次,我在文本文件中读取,并生成csv。我这样做是通过创建一个字典,其中键是标题,值是与标题后面的文本相对应的值;因此:

myDict = {'foo': ['example1', ..., 'last foo in txt file'], 'bar': ['example2', ... 'last bar in txt file'], ... , 'abra': ['cadabra'], ..., 'last abra in txt file']}

我使用csv.DictWriter方法编写我的csv。但是,我目前正在使用循环:

with open(txtFile, 'r') as f:
    for line in f.readlines():
        # create lists that maps to header keys

这很有效,如果' abra'之后只有一行txt。因此,为了连接“abra”中的值。列表来自

abraList = ['cadabra', 'something different', '\n', probably another thing', '\n', 'some number']

并将其更改为:

abraList = ['cadabra something different', '\n', probably another thing', '\n', 'some number']

我使用以下内容:

out = []
for i,e in enumerate(abraList):
    if e in string.whitespace:
        out.append(e)
    else:
        if 0!=i and out[-1][0] not in string.whitespace:
            out.append(out.pop() + ' ' + e)
        else:
            out.append(e)

有人可以帮助我找到一种方法来匹配' abra'之后的所有值。并且在模式再次开始之前使用' foo'?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您实际上不需要新行,最简单的方法是加入列表并再次拆分:

out = ' '.join(abraList).replace(' \n', '\n').replace('\n ', '\n').split('\n')