如何在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+)|...):非捕获组,分两种匹配分支:x=\d+.*?abc (\d+):匹配代码块开头的x=数字,然后非贪婪匹配到abc,捕获其后的整数x=\d+(?:(?!abc).)*:匹配代码块开头的x=数字,然后通过负向预查(?!abc)确保后续内容不包含abc,匹配整个无abc的代码块
(?=\n\n|\Z):正向预查,匹配块分隔的空行或文本结尾,确保每个匹配都是完整的代码块
注意事项
- 如果代码块内部可能出现空行,可以调整边界判断逻辑,但根据你的示例场景,当前表达式足够适用
- 若不需要将数字转为整数,直接保留字符串形式即可,去掉列表推导中的
int()转换
内容的提问来源于stack exchange,提问作者Fox-MSVI
相关产品推荐
相关产品推荐

