我想将一个文件的部分从匹配行打印到空行,所以我正在寻找一种表达方式
sed '/^Word .*/,/^$/'
在Python中。
例如,如果|我有一个包含这些部分的文件:
Fruits
Apples: 10
Oranges: 20
Bananas: 5
Pastry
Cupcakes: 5
Buns: 10
Waffles: 20
如何获取Fruits
部分?
在Perl我能做到:
if ( /^Fruits/ .. /^$/ ) {
print;
}
但我不知道如何用Python做到这一点。
答案 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'}}