【问题标题】:Print sections of a file from a matching line to an empty line将文件的部分从匹配行打印到空行
【发布时间】:2017-10-30 16:00:45
【问题描述】:

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

sed '/^Word .*/,/^$/'

在 Python 中。

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

Fruits
Apples:  10
Oranges: 20
Bananas:  5

Pastry
Cupcakes: 5
Buns:    10
Waffles: 20

如何获得Fruits 部分?

在 Perl 中我可以做到:

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

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

【问题讨论】:

标签: python


【解决方案1】:

你可以用 "\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'}}

【讨论】:

  • 哇,很好的回答!谢谢:)
  • @Dan-SimonMyrland 不用担心!如果您发现答案有用,请考虑将其标记为已接受:)。祝你好运
【解决方案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 确保. 包含换行符。

【讨论】:

  • 感谢@zdim 的建设性意见。不幸的是,"\n\n" 不足以识别任何段落的结尾,因为最后一个段落后面没有空行。人们应该寻找以其中任何一个字符结尾的序列。 (?:\n\n|$) 表达式对我有用。
  • \n\n 通常用于标识一个段落——除了它可能不适用于最后一个段落,正如您所注意到的:) 添加$ 是一个很好的解决方法(并且可以还在那里添加可选空格\s*$,以有效地修剪可能的尾随空格)。
猜你喜欢
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
相关资源
最近更新 更多