将文件的部分从匹配行打印到空行

时间:2017-10-30 16:00:45

标签: python

我想将一个文件的部分从匹配行打印到空行,所以我正在寻找一种表达方式

sed '/^Word .*/,/^$/'
在Python中

例如,如果|我有一个包含这些部分的文件:

Fruits
Apples:  10
Oranges: 20
Bananas:  5

Pastry
Cupcakes: 5
Buns:    10
Waffles: 20

如何获取Fruits部分?

在Perl我能做到:

if ( /^Fruits/ .. /^$/ ) {
    print;
}

但我不知道如何用Python做到这一点。

2 个答案:

答案 0 :(得分:2)

我认为您正在寻找regex

以下示例使用正则表达式提取您的部分:

import re

txt = """Fruits
Apples:  10
Oranges: 20
Bananas:  5

Pastry
Cupcakes: 5
Buns:    10
Waffles: 20"""

print re.findall("Fruits.*?(?:\n\n|$)", txt, re.DOTALL)
print
print re.findall("Pastry.*?(?:\n\n|$)", txt, re.DOTALL)

此处,findall将返回名为"Word.*?(?:\n\n|$)"的字符串中出现txt的所有列表的列表。此处使用的正则表达式表示以Word开头的任何字符序列,后跟在non-greedy模式.中出现0次或更多次的任何字符*?。最后(?:\n\n|$)确保序列以双换行\n\n或字符串结尾$结束。选项re.DOTALL可确保.包含换行符。

答案 1 :(得分:2)

您可以将字符串拆分为" \ n \ n"并查找以Fruits开头的字符串

print(*(i for i in s.split("\n\n") if i.startswith("Fruits")))

或者如果你有多个小组:

print('\n\n'.join((i for i in s.split("\n\n") if i.startswith("Fruits"))))

返回:

Fruits
Apples:  10
Oranges: 20
Bananas:  5

如果:

s = """Fruits
Apples:  10
Oranges: 20
Bananas:  5

Pastry
Cupcakes: 5
Buns:    10
Waffles: 20"""

<强>此外 您还可以通过一行提取项目:

fruits = [i for i in s.split("\n\n") if i.startswith("Fruits")][0]
fruitdict = dict((i.strip() for i in i.split(":")) for i in fruits.split('\n')[1:])
fruitdict

返回:

{'Apples': '10', 'Bananas': '5', 'Oranges': '20'}

提取所有类别:

categories = [i for i in s.split("\n\n")]

d = {}
for item in categories:
    rows = item.split('\n')
    d[rows[0]] = dict((i.strip() for i in i.split(":")) for i in rows[1:])
    # d[rows[0]] = dict((i.split(":")[0],int(i.split(":")[1])) for i in rows[1:])

d

返回:

{'Fruits': {'Apples': '10', 'Bananas': '5', 'Oranges': '20'},
 'Pastry': {'Buns': '10', 'Cupcakes': '5', 'Waffles': '20'}}