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

Python正则匹配含多行项目符号的指定前后缀间内容

解决Python正则匹配两短语间跨多行内容的问题

我来帮你搞定这个正则匹配的问题——你遇到的核心问题是正则默认不处理换行,加上代码里还有语法错误,咱们一步步来修正:

你尝试代码里的问题

先说说你写的代码哪里不对:

  • 正则里的/s是拼写错误,应该是\s,但其实这不是关键,你需要的是匹配换行,得用专门的标志
  • re.findall的调用括号写错了,多了一个闭合括号,直接会导致语法报错
  • 默认情况下.*不会匹配换行符,所以跨多行的内容会被截断
  • 用.*贪婪匹配的话,如果字符串里有多个fdsfdas,会意外匹配到最后一个为止,不是你要的结果

正确的解决方案

要匹配qweqrqr和fdsfdas之间包括换行、任意项目符号在内的所有内容,需要两个关键正则特性:

  1. re.DOTALL(或缩写re.S)标志:让.可以匹配包括换行符在内的任意字符
  2. 非贪婪匹配.*?:确保匹配到第一个fdsfdas就停止,避免过度匹配

修正后的代码

import re

# 示例字符串(包含换行和项目符号)
hello_big_old_world = """qweqrqr Hello 鈥�World Hello 鈥�World
- 项目1:测试跨多行内容
* 项目2:不管是什么项目符号都能匹配
Hello 鈥�World fdsfdas"""

# 执行匹配
matches = re.findall(r'(?<=qweqrqr)(.*?)(?=fdsfdas)', hello_big_old_world, re.DOTALL)

# 输出结果,可按需用strip()去除前后空白
if matches:
    print("匹配到的内容:")
    print(matches[0].strip())
else:
    print("未找到匹配内容")

代码细节解释

  • (?<=qweqrqr):正向零宽后行断言,确保我们从qweqrqr结束的位置开始匹配,不会把这个前缀包含到结果里
  • .*?:非贪婪匹配任意字符,配合re.DOTALL,会匹配换行、各种项目符号(不管是-、*还是其他符号)在内的所有内容,直到遇到第一个fdsfdas
  • (?=fdsfdas):正向零宽先行断言,确保我们在fdsfdas开始的位置停止匹配,不会把这个后缀包含到结果里
  • re.DOTALL:核心标志,解决了跨多行匹配的问题

额外优化(可选)

如果需要单独提取中间的项目符号行,可以在匹配到整体内容后二次筛选,比如:

if matches:
    content = matches[0]
    # 提取所有以-或*开头的项目行
    items = re.findall(r'^[*-]\s+.*', content, re.MULTILINE)
    print("\n提取的项目符号内容:")
    for item in items:
        print(item)

内容的提问来源于stack exchange,提问作者crooose

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:37:24