Python正则匹配含多行项目符号的指定前后缀间内容
解决Python正则匹配两短语间跨多行内容的问题
我来帮你搞定这个正则匹配的问题——你遇到的核心问题是正则默认不处理换行,加上代码里还有语法错误,咱们一步步来修正:
你尝试代码里的问题
先说说你写的代码哪里不对:
- 正则里的
/s是拼写错误,应该是\s,但其实这不是关键,你需要的是匹配换行,得用专门的标志 re.findall的调用括号写错了,多了一个闭合括号,直接会导致语法报错- 默认情况下
.*不会匹配换行符,所以跨多行的内容会被截断 - 用
.*贪婪匹配的话,如果字符串里有多个fdsfdas,会意外匹配到最后一个为止,不是你要的结果
正确的解决方案
要匹配qweqrqr和fdsfdas之间包括换行、任意项目符号在内的所有内容,需要两个关键正则特性:
re.DOTALL(或缩写re.S)标志:让.可以匹配包括换行符在内的任意字符- 非贪婪匹配
.*?:确保匹配到第一个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
相关产品推荐
相关产品推荐

