首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提取类别下面的行,并在到达另一个类别时停止

提取类别下面的行,并在到达另一个类别时停止
EN

Stack Overflow用户
提问于 2010-11-10 13:41:33
回答 3查看 212关注 0票数 1

让我们假设我有一个文本文件的电影类型与我最喜欢的电影在每一种类型。

类别恐怖:

  1. 电影
  2. 电影
  3. 电影

类别喜剧:

  1. 电影

类别行动:

  1. 电影
  2. 电影

我将如何创建一个函数,将某个类别下的所有电影标题提取并打包到一个数组中,而不会溢出到另一个类别中?

EN

回答 3

Stack Overflow用户

发布于 2010-11-10 13:54:04

您可以这样逐行解析文件:

代码语言:javascript
复制
import collections

result=collections.defaultdict(list)
with open('data') as f:
    genre='unknown'
    for line in f:
        line=line.strip()
        if line.startswith('[category]'):
            genre=line.replace('[category]','',1)
        elif line:
            result[genre].append(line)

for key in result:
    print('{k} {m}'.format(k=key,m=list(result[key])))

收益率

代码语言:javascript
复制
 Action: ['1. Movie', '2. Movie']
 Comedy: ['1. Movie']
 Horror: ['1. Movie', '2. Movie', '3. Movie']
票数 2
EN

Stack Overflow用户

发布于 2010-11-10 13:46:30

使用负前瞻

代码语言:javascript
复制
\[category\](?:(?!\[category\]).)*

将匹配整个类别(如果regex是使用re.DOTALL选项编译的)。

可以分别获取类别和内容。

代码语言:javascript
复制
\[category\]\s*([^\r\n]*)\r?\n((?:(?!\[category\]).)*)

匹配后,mymatch.group(1)将包含类别,mymatch.group(2)将包含电影标题。

Python3.1中的示例(将字符串用作mymovies):

代码语言:javascript
复制
>>> import re
>>> myregex = re.compile(r"\[category\]\s*([^\r\n]*)\r?\n((?:(?!\[category\]).)*)", re.DOTALL)
>>> for mymatch in myregex.finditer(mymovies):
...     print("Category: {}".format(mymatch.group(1)))
...     for movie in mymatch.group(2).split("\n"):
...         if movie.strip():
...              print("contains: {}".format(movie.strip()))
...
Category: Horror:
contains: 1. Movie
contains: 2. Movie
contains: 3. Movie
Category: Comedy:
contains: 1. Movie
Category: Action:
contains: 1. Movie
contains: 2. Movie
>>>
票数 1
EN

Stack Overflow用户

发布于 2010-11-10 13:59:17

代码语言:javascript
复制
import re

re_cat = re.compile("\[category\] (.*):")

categories = {}

category = None

for line in open("movies.txt", "r").read().split("\n"):
    line = line.strip()
    if not line:
        continue
    if re_cat.match(line):
        category = re_cat.sub("\\1", line)
        if not category in categories:
            categories[category] = []
 continue
    categories[category].append(line)

print categories

制作以下字典:

代码语言:javascript
复制
{
'Action': ['Movie', 'Movie'],
'Horror': ['Movie', 'Movie', 'Movie'],
'Comedy': ['Movie']
}

我们使用相同的正则表达式来匹配和去掉类别名称,所以用re.compile编译它是非常有效的。

我们有一个正在运行的category变量,每当解析一个新类别时,该变量就会发生变化。不定义新类别的任何行都会在适当的键下添加到categories字典中。第一次定义的类别在正确的字典键下创建一个列表,但是类别也可以被多次列出,所有的东西都会在正确的键下结束。

定义类别之前列出的任何电影都将在字典中的None键下显示。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4145053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档