将一本书解析成章节 - Python

时间:2015-10-19 06:07:34

标签: python regex parsing text-analysis

我有一本大型书籍存储在一个纯文本文件中,并且想要解析它以便为每一章创建单独的文件。我找到了每个章节标题的一些简单的正则表达式,但我正在努力捕捉它们之间的所有文本。

import re

txt = open('book.txt', 'r')

for line in txt :
    if re.match("^[A-Z]+$", line):
        print line,

我知道这是相当简陋的,但我已经足够蟒蛇了,它让我有点难过。目前我一行一行,所以我的思考过程是:

  1. 如果该行是章节标题:创建一个新文件'chapter_title.txt'
  2. 如果下一行不是章节标题:将该行写入chapter_title.txt
  3. 我尝试实际写出来的尝试虽然不太成功。感谢帮助!

    编辑:具体来说,我对文件I / O的Python语法感到困惑。我试过了:

    for line in txt :
        if re.match("^[A-Z]+$", line):
            f = open(line + '.txt', 'w')
        else f.write(line + "\n")
    

    作为我的一般方法,但这不会像书面那样工作。希望有助于构建循环。感谢

3 个答案:

答案 0 :(得分:1)

我认为这会奏效:

import re

with open('book.txt', 'r') as file:
    txt = file.readlines()

f = False

for line in txt:
    if re.match("^[A-Z]+$", line):
        if f: f.close()
        f = open(line + '.txt', 'w')

    else:
        f.write(line + "\n")

也许我应该补充一些解释:

  1. with会自动关闭该文件。关闭打开的文件非常重要。

  2. readlines()函数可以按行读取文件并将输出保存到列表中。

  3. 我在这里使用f = False。因此,if f:第一次为False

  4. 现在重要的是,如果文件f已打开,则if f:将为True,文件将由f.close()关闭(但第一次f.close()将无法运行)。

    然后,f = open(line + '.txt', 'w')将文本写入该文件,当re.match("^[A-Z]+$", line) True文件将被关闭时,打开另一个文件,再次,再次{{1}列表为空。

答案 1 :(得分:1)

也许您也可以尝试以下方法:

import re

with open('book.txt', 'r') as file:
    lines = file.read()

contents = re.split("[A-Z]+", lines)
for i in range(1, len(contents), 2):
    with open(contents[i] + '.txt', 'w') as file:
        file.write(contents[i+1])

书籍内容按章节标题分开。然后,生成的章节内容(contents[i+1])将写入章节文件(contents[i] + '.txt')。

编辑:这假定你有章节标题的固定模式。

答案 2 :(得分:-1)

您在语法方面寻求帮助。

python的完整语法在这里https://docs.python.org/2/reference/grammar.html?highlight=grammar

在这里查看更多罗嗦的python文档@ https://docs.python.org/2/reference/compound_stmts.html#the-if-statement,阅读复合语句(with,for& if)以更准确地了解语法。

另外,请参阅https://docs.python.org/2/library/functions.html#open了解内置功能open()。

与代码块的缩进保持一致并记住: 必须遵循套件前的每一条陈述。

import re

with open('book.txt', 'r') as corpus:
    eye = corpus.readlines()

verdad = False
lambda l: re.match("^[A-Z]+$", l)

for line in eye:
    if l(line):
        if verdad: verdad.close()
        verdad = open(line.replace(' ','_') + '.txt', 'w')
    elif ! l(line):
        if verdad: verdad.close()
    else:
        verdad.write(line + "\n")