仅提取特定字符串后面的数据

2024-09-27 21:23:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件要使用正则表达式从中提取数据,如下所示:

RID:  RSS-130                                         SERVICE                        PAGE:              2   
REPORTING FOR:      100019912 SSSE                      INTSERVICE                    PROC DATE:   15SEP21   
ROLLUP FOR:          100076212 SSSE                          REPORT                        REPORT DATE: 15SEP21   
ENTITY:  1000208212 SSSE                                                                                                 
                                                                                                                                      
                                                                                                                                      
                                                                                                                                      
                                                                                                                                      
 ACQT                                                                                                               
                                                                                                                                      
                                                                                                                                      
   PUR                                                                                                                         
     SAME                      10SEP21                 120            12,263,518             19,48.5                        
                                                                                                                                      
   T PUR                                              120            12,263,518             19,48.5

我编写的用于提取数据的正则表达式:

regex_1 = PROC DATE:\s*(\w+).?*     # to get 15SEP21   
regex_2 = T PUR\s*([0-9,]*\s*[0-9,]*)  # to get the first two elements of the line after T PUR

这是可行的,但在文件中,我有多个记录,就像这个一样,在不同的RID: RSS-130下,例如RID: RSS-140,我只想强制提取RID: RSS-130ACQT之后的信息,并在该记录结束时停止,而不继续从任何情况下提取数据。我如何才能做到这一点

预期的产出将是:

[(15SEP21;120;12,263,518)]仅用于RID: RSS-130下和ACQT后的记录


Tags: 文件to数据reportforgetdate记录
1条回答
网友
1楼 · 发布于 2024-09-27 21:23:32

我建议在这里利用tempered greedy token

(?s)PROC DATE:\s*(?P<date>\w+)(?:(?!RID:\s+RSS-\d).)*T PUR\s+(?P<num>\d[.,\d]*)\s+(?P<val>\d[\d,]*)

regex demo详细信息

  • (?s)-一个内联的re.S/re.DOTALL修饰符
  • PROC DATE:-文字文本
  • \s*-零个或多个空格
  • (?P<date>\w+)-组“日期”:一个或多个单词字符
  • (?:(?!RID:\s+RSS-\d).)*-任何单个字符,零个或多个,但出现次数尽可能多,不会启动RID:\s+RSS-\d模式(块启动模式,RID:,一个或多个空格,RSS-和一个数字)
  • T PUR-一个文本字符串
  • \s+-一个或多个空格
  • (?P<num>\d[.,\d]*)-组“num”:一个数字,然后是零个或多个逗号、点和数字
  • \s+-一个或多个数字
  • (?P<val>\d[\d,]*)-组“val”:一个数字,然后是零个或多个逗号或数字

请参见Python演示:

import re
text = "RID:  RSS-130                                         SERVICE                        PAGE:              2   \nREPORTING FOR:      100019912 SSSE                      INTSERVICE                    PROC DATE:   15SEP21   \nROLLUP FOR:          100076212 SSSE                          REPORT                        REPORT DATE: 15SEP21   \nENTITY:  1000208212 SSSE                                                                                                 \n                                                                                                                                      \n                                                                                                                                      \n                                                                                                                                      \n                                                                                                                                      \n ACQT                                                                                                               \n                                                                                                                                      \n                                                                                                                                      \n   PUR                                                                                                                         \n     SAME                      10SEP21                 120            12,263,518             19,48.5                        \n                                                                                                                                      \n   T PUR                                              120            12,263,518             19,48.5"
rx = r"PROC DATE:\s*(?P<date>\w+)(?:(?!RID:\s+RSS-\d).)*T PUR\s+(?P<num>\d[.,\d]*)\s+(?P<val>\d[\d,]*)"
m = re.search(rx, text, re.DOTALL)
if m:
    print(m.groupdict())

# => {'date': '15SEP21', 'num': '120', 'val': '12,263,518'}

如果必须在ACQT之后检查T PUR,请将模式修改为

(?s)PROC DATE:\s*(?P<date>\w+)(?:(?!RID:\s+RSS-\d|ACQT).)*ACQT(?:(?!RID:\s+RSS-\d).)*T PUR\s+(?P<num>\d[.,\d]*)\s+(?P<val>\d[\d,]*)

this regex demo

相关问题 更多 >

    热门问题