单步Python正则匹配含2个以上数字的温哥华格式参考文献括号
解决温哥华格式参考文献括号匹配问题
需求与示例
需求:使用单步Python正则表达式,匹配温哥华格式科技论文中**包含2个以上数字(区分数字与数位)**的参考文献组合括号。
示例输入文本:blabla [23,24] bleble [23,24,28-30] blibli [40,45-48] bloblo [113]期望匹配结果:
['[23,24,28-30]', '[40,45-48]']
错误正则分析
此前尝试的正则r"\[[,\-(?:\d+)]{3,}\]"无法满足需求,核心问题是:
- 正则中的
[,\-(?:\d+)]属于字符集,其中的(?:\d+)不会被当作分组解析,而是被拆分为(、?、:、\d、+这些单个字符,导致匹配逻辑完全偏离预期。
正确正则表达式
以下单步正则可精准实现需求:
r"\[(?:(?:\d+(?:-\d+)?,){2}\d+(?:-\d+)?|(?:\d+-\d+,\d+|\d+,\d+-\d+))\]"
正则逻辑说明
该正则通过两个分支覆盖所有符合条件的场景:
- 第一个分支
(?:\d+(?:-\d+)?,){2}\d+(?:-\d+)?:匹配包含3个及以上参考文献条目的括号(每个条目可以是单个数字或数字范围),这类条目总数字数必然≥3。 - 第二个分支
(?:\d+-\d+,\d+|\d+,\d+-\d+):匹配包含2个条目且其中至少一个是数字范围的括号,这类场景的总数字数为3(1个单个数字+2个范围数字)。
验证效果
在Python中测试:
import re text = "blabla [23,24] bleble [23,24,28-30] blibli [40,45-48] bloblo [113]" pattern = r"\[(?:(?:\d+(?:-\d+)?,){2}\d+(?:-\d+)?|(?:\d+-\d+,\d+|\d+,\d+-\d+))\]" matches = re.findall(pattern, text) print(matches)
输出结果与期望完全一致:
['[23,24,28-30]', '[40,45-48]']
内容的提问来源于stack exchange,提问作者José Crespo Barrios
相关产品推荐
相关产品推荐

