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

如何在Python中用正则表达式匹配代码块内指定内容?

Python正则表达式提取代码块指定内容的解决方案

问题场景

我有一个由多个代码块组成的长文件,每个代码块以x=数字开头,块之间以空行分隔,示例如下:

x=0
abc 20    
def 76   
ghi 11

x=1
def 45
ghi 32

x=2
jkl 56
mno 76
abc 134

.
.
.

x=393
xyz 21
abc 9

x=394
ghi 43
def 166
xyz 25

需要编写Python正则表达式,实现以下输出:

return_list = [20,'x',134,...,9,'x']

要求:每个代码块中若存在abc,则匹配abc后的整数;若不存在,则匹配块开头的'x'。各代码块的行数不固定。已写出正则表达式(?ms)(?=x=\d).*?(?=\n\n)可单独匹配每个代码块,但不知如何扩展实现需求。

解决方案

核心思路

利用正则的优先匹配特性,在每个代码块中优先捕获abc后的数字;如果代码块中没有abc,则返回固定字符串'x'。基于你已有的块匹配逻辑,扩展成能直接提取目标内容的表达式。

代码实现

import re

# 替换为你的实际文件内容
input_text = """x=0
abc 20    
def 76   
ghi 11

x=1
def 45
ghi 32

x=2
jkl 56
mno 76
abc 134

x=393
xyz 21
abc 9

x=394
ghi 43
def 166
xyz 25
"""

# 正则表达式:匹配每个代码块,优先捕获abc后的数字
pattern = r'(?ms)(?:x=\d+.*?abc (\d+)|x=\d+(?:(?!abc).)*)(?=\n\n|\Z)'

# 提取结果并格式化
raw_matches = re.findall(pattern, input_text)
return_list = [int(match) if match else 'x' for match in raw_matches]

print(return_list)
# 输出结果:[20, 'x', 134, 9, 'x']

正则表达式详解

  • (?ms):开启多行模式(m)和单行模式(s),让.可以匹配换行符,确保能覆盖整个代码块
  • (?:x=\d+.*?abc (\d+)|...):非捕获组,分两种匹配分支:
    1. x=\d+.*?abc (\d+):匹配代码块开头的x=数字,然后非贪婪匹配到abc,捕获其后的整数
    2. x=\d+(?:(?!abc).)*:匹配代码块开头的x=数字,然后通过负向预查(?!abc)确保后续内容不包含abc,匹配整个无abc的代码块
  • (?=\n\n|\Z):正向预查,匹配块分隔的空行或文本结尾,确保每个匹配都是完整的代码块

注意事项

  • 如果代码块内部可能出现空行,可以调整边界判断逻辑,但根据你的示例场景,当前表达式足够适用
  • 若不需要将数字转为整数,直接保留字符串形式即可,去掉列表推导中的int()转换

内容的提问来源于stack exchange,提问作者Fox-MSVI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 00:14:57