Python中按双条件拆分字符串:提取书名与作者(含括号处理)
提取带括号书名与作者的正则解决方案
原始输入文本
my_text = """ My favorites books of all time are: Harry potter by JK Rowling, Dune (first book) by Frank Herbert; and Le Petit Prince by Antoine de Saint Exupery (I read it many times). """
期望输出
output = [ ['Harry Potter', 'JK Rowling'], ['Dune (first book)', 'Frank Herbert'], ['and Le Petit Prince', 'Antoine de Saint Exupery'] ]
常规方法的痛点
常规拆分法(先按非ASCII字符拆分,再筛选含"by"的片段拆分)无法区分书名内的括号和作者后的括号:要么误删书名里的括号内容,要么无法正确截断作者后面的附加注释。
正则表达式方案
直接用re.findall通过正则匹配一次性提取目标内容,无需多次拆分:
正则模式
([\w\s\(\)]+?)\s+by\s+([\w\s]+?)(?=[,\.;\(]|$)
模式解释
([\w\s\(\)]+?):匹配书名,允许字母、空格、括号,非贪婪模式避免过度匹配后续内容\s+by\s+:匹配分隔符"by",前后兼容任意数量空格,适配文本排版差异([\w\s]+?):匹配作者名,允许字母和空格,非贪婪模式控制匹配范围(?=[,\.;\(]|$):正向预查断言,当作者名后遇到逗号、分号、句号、左括号或字符串结尾时停止匹配,精准截断附加内容
Python代码实现
import re my_text = """ My favorites books of all time are: Harry potter by JK Rowling, Dune (first book) by Frank Herbert; and Le Petit Prince by Antoine de Saint Exupery (I read it many times). """ # 定义正则模式 pattern = r'([\w\s\(\)]+?)\s+by\s+([\w\s]+?)(?=[,\.;\(]|$)' # 提取所有匹配项 matches = re.findall(pattern, my_text) # 按需格式化(若不需要首字母大写,直接用matches即可) formatted_result = [] for title, author in matches: formatted_title = title.strip() # 如果需要首字母大写,替换成 formatted_title = title.strip().title() formatted_result.append([formatted_title, author.strip()]) print(formatted_result)
运行结果
[ ['Harry potter', 'JK Rowling'], ['Dune (first book)', 'Frank Herbert'], ['and Le Petit Prince', 'Antoine de Saint Exupery'] ]
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

