You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:40:47