python - 正则表达式返回第一个和最后一个匹配,而不是在匹配括号之间返回第一个和第二个匹配
问题描述
我正在尝试解析文本以提取所需的字符串。我在 中遗漏了一些东西regex
,有人可以帮我弄清楚这里有什么问题吗?
这是我的脚本:
import re
a = """
block1
#(/*AUTOINSTPARAM*/
// Parameters
.THREE (3), // comment
.TWO (2), // comment
.ONE (1)) // comment
inst1
(/*AUTOINST*/
// extra
// output
block2
#(/*AUTOINSTPARAM*/
// Parameters
.THREE (3), // comment
.TWO (2), // comment
.ONE (1)) // comment
inst2
(/*AUTOINST*/
// extra
// output
"""
op = re.findall(r'(\w+)\s*(#\(.*\))?.*?(\w+)\s*\(', a, re.MULTILINE|re.DOTALL)
for i in op:
print(i[0],i[2])
这是输出:
('block1', 'inst2')
预期输出:
('block1', 'inst1')
('block2', 'inst2')
更新:尝试测试与接受的答案相同的正则表达式的以下输入:
import re
a = """
except_check
#(
.a (m),
.b (w),
.c (x),
.d (1),
.e (1)
)
data_check
(// Outputs
abc
#(
.a (b::c)
)
mask
(/*AUTOINST*/
"""
op = re.findall(r'^\s*(\w+)\s*$\n(?:^\s*[#/.].*$\n)*^\s*(\w+)\s*\(', a, re.MULTILINE)
for i in op:
print(i)
它没有返回任何东西。它应该返回以下内容:
('except_check', 'data_check')
('abc', 'mask')
解决方案
请您尝试以下方法:
#op = re.findall(r'^\s*(\w+)\s*$\n(?:^\s*[#/.].*$\n)*^\s*(\w+)\s*\(', a, re.MULTILINE)
op = re.findall(r'^\s*(\w+)\s*$\n(?:^\s*[^\w\s].*$\n)*^\s*(\w+)\s*\(', a, re.MULTILINE)
for i in op:
print(i)
输出:
('block1', 'inst1')
('block2', 'inst2')
^\s*(\w+)\s*$\n
匹配块名行(?:^\s*[^\w\s].*$\n)*
匹配参数行^\s*(\w+)\s*\(
匹配实例名称行
请注意,我已禁用该re.DOTALL
选项(尽管解决此问题很简单)。
推荐阅读
- vue.js - 在 Nuxt 中使用来自布局的异步获取
- spring - 将数据从 Soring 启动应用程序添加到 Mondo DB
- docker - 如何缩小 Docker 磁盘映像,但在 Docker for Mac 中保留卷?
- direct3d - 如何处理 Direct3D 9Ex D3DERR_DEVICEHUNG 错误?
- node.js - npm 错误的 .pem 文件!由于代理,无法在 Windows 中安装软件包
- arrays - 使用“MPI_Gatherv”沿第 n 维堆叠数组
- spring - 如果数据库在 Spring 5 和 Hibernate 中关闭,则 Autocrate 数据库忽略错误
- python - 在文件写入时创建目录树
- sql-server - 如何在 SQL Server 中为同一类别按固定行数进行分区?
- r - Mann-Whitney U 的 p 值为 1 - 人工制品?