正则表达式:分组为匹配数组,中间有 CR
Regex: group as an array of mathches with CR in between
我正在尝试在 Python 中解析包含此格式信息的文件
aaa 111(zzz)
222
333
bbb 555
111
这基本上是一种将 aaa
与 111
、222
和 333
联系起来的方式(一种参考 table)。请注意,zzz
是可选的,尽管现在这并不重要。
我想得到的是这样的:
匹配 1
- 第 1 组。'aaa'
- 第 2 组。['111', '222', '333']
匹配 2
- 第 1 组。'bbb'
- 第 2 组。['555', '111']
我正在苦苦挣扎的是如何将 group 2
作为一个数组。虽然我可能走错了路。
有人可以照亮我吗?
这是我现在的 attempt。不过,它甚至与我试图实现的目标相去甚远。
更新
我将使用 Python 并且很可能 re
作为正则表达式模块。
您需要将捕获必要部分的块匹配到两组中,然后split/extract从第 2 组中选择您需要的部分。
^(\S+)\s+(.*(?:[\r\n]+ +.*)*)
详情
^
- 行首(由于 re.M
)
(\S+)
- 第 1 组:一个或多个非空白字符
\s+
- 1 个或多个空格
(.*(?:[\r\n]+ +.*)*)
- 第 2 组:
.*
- 该行的其余部分
(?:[\r\n]+ +.*)*
- 零次或多次出现
[\r\n]+
- 1 个或多个换行字符
+
- 一个或多个空格(您可以将其替换为 [^\S\r\n]*
以匹配任何水平空格)
.*
- 该行的其余部分
import re
s = """aaa 111(zzz)
222
333
bbb 555
111"""
rx= r'^(\S+)\s+(.*(?:[\r\n]+ +.*)*)'
res =[]
for m in re.finditer(rx, s, re.M):
res.append((m.group(1), re.findall(r"[0-9]+", m.group(2))))
# res.append((m.group(1), m.group(2).split())) # or split with whitespace
print(res) # => [('aaa', ['111', '222', '333']), ('bbb', ['555', '111'])]
我正在尝试在 Python 中解析包含此格式信息的文件
aaa 111(zzz)
222
333
bbb 555
111
这基本上是一种将 aaa
与 111
、222
和 333
联系起来的方式(一种参考 table)。请注意,zzz
是可选的,尽管现在这并不重要。
我想得到的是这样的:
匹配 1
- 第 1 组。'aaa'
- 第 2 组。['111', '222', '333']
匹配 2
- 第 1 组。'bbb'
- 第 2 组。['555', '111']
我正在苦苦挣扎的是如何将 group 2
作为一个数组。虽然我可能走错了路。
有人可以照亮我吗?
这是我现在的 attempt。不过,它甚至与我试图实现的目标相去甚远。
更新
我将使用 Python 并且很可能 re
作为正则表达式模块。
您需要将捕获必要部分的块匹配到两组中,然后split/extract从第 2 组中选择您需要的部分。
^(\S+)\s+(.*(?:[\r\n]+ +.*)*)
详情
^
- 行首(由于re.M
)(\S+)
- 第 1 组:一个或多个非空白字符\s+
- 1 个或多个空格(.*(?:[\r\n]+ +.*)*)
- 第 2 组:.*
- 该行的其余部分(?:[\r\n]+ +.*)*
- 零次或多次出现[\r\n]+
- 1 个或多个换行字符+
- 一个或多个空格(您可以将其替换为[^\S\r\n]*
以匹配任何水平空格).*
- 该行的其余部分
import re
s = """aaa 111(zzz)
222
333
bbb 555
111"""
rx= r'^(\S+)\s+(.*(?:[\r\n]+ +.*)*)'
res =[]
for m in re.finditer(rx, s, re.M):
res.append((m.group(1), re.findall(r"[0-9]+", m.group(2))))
# res.append((m.group(1), m.group(2).split())) # or split with whitespace
print(res) # => [('aaa', ['111', '222', '333']), ('bbb', ['555', '111'])]