Python 多行模式搜索
Python multiline pattern search
我得到了以下文本,我需要对其进行解析以提取所有三个值的组。对于这个具体示例,我需要这样的输出:[1,1,1],[2,2,2],[3,2,3],[4,2,4]
我试图使用这个 reg expr:
re.findall(r'measId \d+,[\n\r]measObjectId \d+[\n\r],reportConfigId \d+',output)
但它总是 returns 零结果。我已经尝试过使用 re.MULTILINE 标志和不使用 re.MULTILINE 标志的多种组合,但没有任何区别。
我究竟做错了什么?有什么建议吗?
measIdToAddModList {
{
measId 1,
measObjectId 1,
reportConfigId 1
},
{
measId 2,
measObjectId 2,
reportConfigId 2
},
{
measId 3,
measObjectId 2,
reportConfigId 3
},
{
measId 4,
measObjectId 2,
reportConfigId 4
}
这是最天真的解决方案。仅当恰好存在三个字段时才有效:
re.findall(r'\{\s+(\w+\s+\d+),\s+(\w+\s+\d+),\s+(\w+\s+\d+)\s+}', s)
#[('measId 1', 'measObjectId 1', 'reportConfigId 1'),
# ('measId 2', 'measObjectId 2', 'reportConfigId 2'),
# ('measId 3', 'measObjectId 2', 'reportConfigId 3'),
# ('measId 4', 'measObjectId 2', 'reportConfigId 4')]
解释:
\{ # Opening curly brace
\s+ # One or more spaces
(\w+\s+\d+) # word, spaces, digits
,\s+ # comma, spaces
(\w+\s+\d+)
,\s+
(\w+\s+\d+)
\s+ # spaces
} # Closing curly brace
模式 [\w]+\s[\d]
匹配您需要的一行。
使用 python 获取您需要的一切。假设您将输入作为 str
命名为 input
.
import re
from collections import defaultdict
output = defaultdict(list)
pattern = re.compile(r'(?P<key>[\w]+)\s(?P<value>[\d])')
for line in input.splitlines():
match = pattern.search(line)
if match:
key = match.group('key')
value = match.group('value')
output[key].append(value)
output
是一个字典,其中键是文本值,值是文本右侧的数字列表。
{'measId': ['1', '2', '3', '4'],
'measObjectId': ['1', '2', '2', '2'],
'reportConfigId': ['1', '2', '3', '4']}
不确定您需要的输出,但绝对可以从那里对其进行建模。例如:
>>> list(zip(*output.values()))
[('1', '1', '1'), ('2', '2', '2'), ('3', '2', '3'), ('4', '2', '4')]
中查看
我得到了以下文本,我需要对其进行解析以提取所有三个值的组。对于这个具体示例,我需要这样的输出:[1,1,1],[2,2,2],[3,2,3],[4,2,4] 我试图使用这个 reg expr:
re.findall(r'measId \d+,[\n\r]measObjectId \d+[\n\r],reportConfigId \d+',output)
但它总是 returns 零结果。我已经尝试过使用 re.MULTILINE 标志和不使用 re.MULTILINE 标志的多种组合,但没有任何区别。 我究竟做错了什么?有什么建议吗?
measIdToAddModList {
{
measId 1,
measObjectId 1,
reportConfigId 1
},
{
measId 2,
measObjectId 2,
reportConfigId 2
},
{
measId 3,
measObjectId 2,
reportConfigId 3
},
{
measId 4,
measObjectId 2,
reportConfigId 4
}
这是最天真的解决方案。仅当恰好存在三个字段时才有效:
re.findall(r'\{\s+(\w+\s+\d+),\s+(\w+\s+\d+),\s+(\w+\s+\d+)\s+}', s)
#[('measId 1', 'measObjectId 1', 'reportConfigId 1'),
# ('measId 2', 'measObjectId 2', 'reportConfigId 2'),
# ('measId 3', 'measObjectId 2', 'reportConfigId 3'),
# ('measId 4', 'measObjectId 2', 'reportConfigId 4')]
解释:
\{ # Opening curly brace
\s+ # One or more spaces
(\w+\s+\d+) # word, spaces, digits
,\s+ # comma, spaces
(\w+\s+\d+)
,\s+
(\w+\s+\d+)
\s+ # spaces
} # Closing curly brace
模式 [\w]+\s[\d]
匹配您需要的一行。
使用 python 获取您需要的一切。假设您将输入作为 str
命名为 input
.
import re
from collections import defaultdict
output = defaultdict(list)
pattern = re.compile(r'(?P<key>[\w]+)\s(?P<value>[\d])')
for line in input.splitlines():
match = pattern.search(line)
if match:
key = match.group('key')
value = match.group('value')
output[key].append(value)
output
是一个字典,其中键是文本值,值是文本右侧的数字列表。
{'measId': ['1', '2', '3', '4'],
'measObjectId': ['1', '2', '2', '2'],
'reportConfigId': ['1', '2', '3', '4']}
不确定您需要的输出,但绝对可以从那里对其进行建模。例如:
>>> list(zip(*output.values()))
[('1', '1', '1'), ('2', '2', '2'), ('3', '2', '3'), ('4', '2', '4')]
中查看