Closed. This question needs to be more focused。它目前不接受答案。
想改进这个问题吗?更新问题,使其只关注一个问题editing this post
8个月前关闭。
我想用python提取一本书的章节。我给每一本书的每一章贴上标签,标明每一章的开始和结束。本章开头的标记是[@introS],结尾的标记是[@introS end]我的代码的目标是提取标记之间的所有内容(对应于每个章节的文本),并要求用户命名每个章节并写入文件。但是,当我打印匹配结果时,将打印整个文本。只有在开始标记和结束标记被行分隔时,此代码才起作用。
输入示例:
帕尔套房的内容化名不要在维也纳的帕尔勒,费尔M.约翰
巴兰坦,埃迪特,$沃尔特·斯科特,苏特努恩
讨论:在chacun$d'eux Soutenan que,Londres Confère de Londres
儿子杰迪雅·克利什波坦·泰特·勒夫赖·西蒙·普莱恩。$第一章。
$[@introS]请看《迷信》和《裸体》
总收入和长期收入
国家邮政总局$-Je bénis comm vous la bienfaiante main$Qui
休曼风格:梅因赛义士酒店(Mais sur les moines seuls)
在事业上,$这是一个反对的理由。
$Je croirais aussi bien que Molly Warburton,$Traversant塞特努伊特
伯顿机场,$Causa l'orage affreux qui gronda sur nos
泰斯。$Ancienne公司。$E村
唐恩·勒诺姆(donne le nom$de Kennaquehair porte la mème terminaison celtique qu'on)
$trouve dans Traquhair,Caquhair,et d'autres mots com$posés.Le公司
萨凡特·查尔默斯的“普雷滕·奎尔·奎尔”$-象征着新诺西德
杜内里维埃和诺姆布鲁花呢
乡村景观学$assez vraisemblable[@introEnd@]。
[@introS]肯纳黑尔酒店(Kennaquair aétécéièbre par le$superbe Monasterère)
圣玛丽,大卫一世,洛伊德科塞,$雷恩
duquel'sélevèrent aussi les couvents non moins riches$德梅尔罗斯
杰德堡和德凯索。可考虑的域名$que ce monarque
根据不同的宗教目录
圣帕莱梅因教堂
阿巴沃里山脉的后代
在圣珀拉库隆街$在peut cependant présumer que上
大卫,奥西萨格王子
宗教主题是孙子的$•/$[@introEnd@]。[@简介]
谷歌最辛苦的工作在分道扬镳avec des bibliothËques‡
乌夫拉格斯努姆广场酒店
可携带物品。有效的生活
一些人吹捧简单的事物
帕特里莫因花园。$Il s'agit toutefois d'un projet有限公司。
传播资源的标准和标准
在资产负债表中,资产负债表中的资产处置
venir lesÈventuels毗邻auxquels Pourrance se Liverer des遗址
marchands tiers,著名的$containtes技术
亲属自动请求。
我试过的代码如下。
我试过使用match,但我不确定这是否是最好的方法…也许试试findall或search?
import re


def separate_chapters ():

    pat = re.compile('(?<=\[@introS\]).+?(?=\[@introEnd@\])')

    with open('text1_scott.txt') as file:

        for i in filter(pat.match, file):
            print(i)
            inp = input("write text to a file? Y|N: ")
            if inp != "Y":
                continue

            file_name = input("Name of your file: ")

            with open(file_name, "w") as out_file:
                out_file.write(i)
            print("text {} written to a file".format(i))


separate_chapters()

我不想把章节分成不同的行…我想提取整个文本块,即使在同一行有标记…怎么做?

最佳答案

你的模式有点不正确。您需要转义[]而不需要转义@,因为@在regex中不是特殊字符。同样,对于捕获那些开始和结束标记之间的内容,.是不够的,因为它只捕获一个字符,因此您需要使用look arounds和.+?以非贪婪的方式捕获它们之间的文本。尝试使用这个正则表达式,

(?<=\[@introS\]).+?(?=\[@introEnd@\])

在这里,(?<=\[@introS\])正向后视确保捕获的文本前面正好是字面上的[@introS]文本,然后.+?尽可能少地捕获任何一个或多个字符,(?=\[@introEnd@\])正向前视确保捕获的文本后面紧跟着字面上的[@introEnd@]
Online Demo
编辑:
你的代码中有几个问题。
你的regex声明不正确,因为字符串没有被引用,我已经告诉过你,你已经修复了。
您需要对read()对象调用file函数以从文件中检索字符串
您可以只使用简单的findall而不是match,match的工作方式不同,并尝试将全文与regex匹配
您需要使用encoding="utf-8"来读/写文件,因为文件包含Unicode字符。
这是你的代码的最新工作副本,
import re

def separate_chapters():
 pat = re.compile(r'(?<=\[@introS\]).+?(?=\[@introEnd@\])')
 with open('text1_scott.txt', 'r', encoding="utf-8") as file:
  for i in pat.findall(file.read()):
   print(i)
   inp = input("write text to a file? Y|N: ")
   if inp != "Y":
    continue

   file_name = input("Name of your file: ")

   with open(file_name, "w", encoding="utf-8") as out_file:
     out_file.write(i)
     print("text {} written to a file".format(i))


separate_chapters()

它执行得很好,并在提示输入文件名时用我输入的文件名编写了章节文本。快凌晨3点了,感觉太累了,要睡觉了,现在可能无法回答任何进一步的问题,但肯定会在早上回答。希望你不要再面对任何问题。

07-24 09:52
查看更多