Joa*_*edo 5 python regex multiline pattern-matching
考虑以下文本模式,
#goals:进程报告时间戳,例如.2011-09-21 15:45:00和succ的前两个统计.统计线,例如: 1438 1439
input_text = '''
# Process_Name ( 23387) Report at 2011-09-21 15:45:00.001 Type: Periodic #\n
some line 1\n
some line 2\n
some other lines\n
succ. statistics | 1438 1439 99 | 3782245 3797376 99 |\n
some lines\n
Process_Name ( 23387) Report at 2011-09-21 15:50:00.001 Type: Periodic #\n
some line 1\n
some line 2\n
some other lines\n
succ. statistics | 1436 1440 99 | 3782459 3797523 99 |\n
repeat the pattern several hundred times...
'''
Run Code Online (Sandbox Code Playgroud)
我在迭代迭代时得到它,
def parse_file(file_handler, patterns):
results = []
for line in file_handler:
for key in patterns.iterkeys():
result = re.match(patterns[key], line)
if result:
results.append( result )
return results
patterns = {
'report_date_time': re.compile('^# Process_Name\s*\(\s*\d+\) Report at (.*)\.[0-9] {3}\s+Type:\s*Periodic\s*#\s*.*$'),
'serv_term_stats': re.compile('^succ. statistics \|\s+(\d+)\s+ (\d+)+\s+\d+\s+\|\s+\d+\s+\d+\s+\d+\s+\|\s*$'),
}
results = parse_file(fh, patterns)
Run Code Online (Sandbox Code Playgroud)
回国
[('2011-09-21 15:40:00',),
('1425', '1428'),
('2011-09-21 15:45:00',),
('1438', '1439')]
Run Code Online (Sandbox Code Playgroud)
但有一个元组输出列表作为我的目标,
[('2011-09-21 15:40:00','1425', '1428'),
('2011-09-21 15:45:00', '1438', '1439')]
Run Code Online (Sandbox Code Playgroud)
我尝试了几个具有初始模式和它们之间的惰性量词的组合,但无法弄清楚如何使用多线REGEX捕获模式
# .+? Lazy quantifier "match as few characters as possible (all characters allowed) until reaching the next expression"
pattern = '# Process_Name\s*\(\s*\d+\) Report at (.*)\.[0-9]{3}\s+Type:\s*Periodic.*?succ. statistics) \|\s+(\d+)\s+(\d+)+\s+\d+\s+\|\s+\d+\s+\d+\s+\d+\s+\|\s'
regex = re.compile(pattern, flags=re.MULTILINE)
data = file_handler.read()
for match in regex.finditer(data):
results = match.groups()
Run Code Online (Sandbox Code Playgroud)
我怎么能做到这一点?
使用re.DOTALLso .将匹配任何字符,包括换行符:
import re
data = '''
# Process_Name ( 23387) Report at 2011-09-21 15:45:00.001 Type: Periodic #\n
some line 1\n
some line 2\n
some other lines\n
succ. statistics | 1438 1439 99 | 3782245 3797376 99 |\n
some lines\n
repeat the pattern several hundred times...
'''
pattern = r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).*?succ. statistics\s+\|\s+(\d+)\s+(\d+)'
regex = re.compile(pattern, flags=re.MULTILINE|re.DOTALL)
for match in regex.finditer(data):
results = match.groups()
print(results)
# ('2011-09-21', '1438', '1439')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5673 次 |
| 最近记录: |