Python文件解析:无法捕获换行字符串,需提取书籍作者
解决你的书籍数据解析问题:提取作者 + 修复换行捕获bug
嘿,我来帮你搞定这两个问题——从那56900条书籍记录里精准提取作者,同时解决Python读取文件时抓不到换行字符串的坑。
一、先搞定换行捕获的问题
你说Python解析时无法捕获换行字符串,大概率是读取文件的方式不对。很多人用readlines()的时候,容易忽略混合换行(比如Windows的\r\n和Linux的\n)的情况,或者没把整个文件内容读进来。
最稳妥的做法是一次性读取整个文件,这样所有换行符都会被完整保留:
# 读取完整文件内容,保留所有换行和格式细节 with open("你的书籍文件.txt", "r", encoding="utf-8") as f: full_content = f.read() # 统一换行符(如果文件里有混合的\r\n和\n,转成统一的\n) full_content = full_content.replace("\r\n", "\n")
这样处理后,你拿到的full_content就包含了所有换行,不会漏掉任何一行的边界信息,后续解析就靠谱多了。
二、提取作者信息的正则方案
从你给的示例来看,记录格式有几种变体,但核心规律是:作者名字前面会有“by”(英文)或者对应语言的等价词(比如芬兰语的mennessä),后面跟着ETEXT编号(5位数字)或者换行。
我给你写个灵活的正则表达式,能覆盖这些情况:
(?:by|mennessä)\s+([^0-9\n]+)
正则拆解:
(?:by|mennessä):匹配“by”或者芬兰语的“mennessä”,用非捕获组避免多余的匹配结果;\s+:匹配一个或多个空白字符(空格、制表符都算);([^0-9\n]+):捕获作者名字——匹配除了数字(ETEXT编号)和换行(下一条记录)之外的所有字符,精准定位作者。
完整Python代码
结合上面的文件读取,把提取逻辑整合起来:
import re # 读取并预处理文件 with open("你的书籍文件.txt", "r", encoding="utf-8") as f: full_content = f.read() full_content = full_content.replace("\r\n", "\n") # 定义正则,可扩展添加其他语言的"by"等价词(比如法语par、德语von) author_regex = re.compile(r'(?:by|mennessä)\s+([^0-9\n]+)', re.IGNORECASE) # 提取所有作者 raw_authors = author_regex.findall(full_content) # 清理作者名字(去掉前后空格、末尾多余的逗号) clean_authors = [author.strip().rstrip(',') for author in raw_authors] # 输出或保存结果 # 打印前10条看看效果 for i, author in enumerate(clean_authors[:10], 1): print(f"第{i}条作者:{author}") # 保存到文件 with open("提取的作者列表.txt", "w", encoding="utf-8") as f: f.write("\n".join(clean_authors))
针对特殊情况的优化
如果遇到作者名字里带数字(极少情况),或者编号不是5位,可以把正则改成更精准的版本,匹配到编号前就停止:
(?:by|mennessä)\s+(.+?)(?=\s+\d{5}|\n|$)
这个版本的意思是:匹配前缀后的内容,直到遇到“5位数字”、换行或者文本结尾,完美避开编号干扰。
另外,如果有其他语言的书籍,比如法语的par,直接把它加到正则的非捕获组里就行:(?:by|mennessä|par)。
三、测试验证
拿你给的示例文本跑代码,输入:
Aspects of plant life; with special reference to the British flora, 56900 by Robert Lloyd Praeger The Vicar of Morwenstow, by Sabine Baring-Gould 56899 [Subtitle: Being a Life of Robert Stephen Hawker, M.A.] Raamatun tutkisteluja IV, mennessä Charles T. Russell 56898 [Subtitle: Harmagedonin taistelu] [Language: Finn...
输出的作者列表会是:
Robert Lloyd Praeger Sabine Baring-Gould Charles T. Russell
完全符合预期。
内容的提问来源于stack exchange,提问作者Azazel
相关产品推荐
相关产品推荐

