电话
400 9058 355
本文讲解如何用 python 正则表达式精准匹配并分组提取形如“1. @xxx”开头、后续紧跟多个 java 注解(如 `@autowired`、`@override`)的连续文本块,解决单行匹配导致分组断裂的问题。
在处理结构化注释文本(如代码片段、文档标记或测试用例描述)时,常需按逻辑单元提取内容——例如将 "1. @aut1.or\n@Autowired" 视为一个完整条目,而非仅匹配编号行。原始正则 (?:[0-9][.][ ]).+ 仅捕获每行开头的编号项,忽略了换行后紧随的注解行,导致语义割裂。
正确思路是:先识别每个新条目的起始标记(如 ^\d+\.\s+@\w+),再贪婪捕获其后所有连续的注解行(@\w+),直到遇到下一个编号或文本结束。
但由于 re.findall 不支持直接跨行“累积匹配”,推荐采用两阶段策略:
以下为健壮、可读性强的实现方案:
import re
txt = '''1. @aut1.or
@Autowired
2. @Override
@param
@SuppressWarnings'''
# 步骤1:用正则定位所有“编号行”位置(含换行符边界)
pattern = r'(\d+\.\s+@\w+\S*)\s*(?=(?:\n@\w+\S*)*?(?=\n\d+\.|\Z))'
# 解析说明:
# - (\d+\.\s+@\w+\S*) → 捕获编号行首个注解(如 "1. @aut1.or")
# - (?=...) → 正向先行断言,确保后续是零或多个 "\n@...",且以 "\n数字." 或文本结尾终止
# 步骤2:逐个提取完整块(含后续注解)
blocks = []
for match in re.finditer(pattern, txt, re.MULTILINE):
start_pos = match.start()
# 从匹配起点开始,提取到下一个编号前的所有行(含当前行)
block_end = re.search(r'\n(?=\d+\. )', txt[start_pos:], re.DOTALL)
end_pos = block_end.end() + start_pos if block_end else len(txt)
full_block = txt[start_pos:end_pos].strip()
blocks.append(full_block)
print(blocks)
# 输出:['1. @aut1.or\n@Autowired', '2. @Override\n@param\n@SuppressWarnings']⚠️ 注意事项:
总结:正则适用于规则明确的轻量文本分组,关键在于合理设计锚点(如 ^, \n, \d+\.)与断言((?=...)),避免过度依赖 .+ 这类模糊匹配。对结构化数据,优先保证可读
性与可扩展性,必要时让位于清晰的循环逻辑。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...