正则表达式匹配一行中的所有模式

时间:2017-01-20 06:51:34

标签: python regex

我正在尝试搜索一些日志文件以找到一行,例如:

'A-Topeka-Firesale\:\s\*132\*\d{2,5}\*[23]\d{9}\#'

并且一旦匹配该行,就在文件中向后移动并找到前一行,如下所示:

2016-12-30 11:02:12 DEBUG[ispatcher-18269] ab.talk.this.api.Api - http://hostname:19991/trapeze?session_id=176764&manager_event=old&apostrophe=2341231231234&_operation=doc 3da48a90-0f4f-4eb3-a241-94a1f05b891b requesting:

我需要将"http://hostname:19991/trapeze?""manager_event=old"requesting:与第二行(通常在第一场比赛之间的3-5行之间)匹配才能匹配。

到目前为止,我尝试过各种变体:

for each, line in enumerate(f):
first_match = re.search(b'A-Topeka-Firesale\:\s\*132\*\d{2,5}\*[23]\d{9}\#', line)     
    if first_match:
for i in range(each, -1, -1)
    if re.match("|".join(['http://hostname:19991/trapeze', 'manager_event=old', 'requesting:']), str(f[i])):
        break

和此:

for each, line in enumerate(f):
    first_match = re.search(b'A-Topeka-Firesale\:\s\*132\*\d{2,5}\*[23]\d{9}\#', line)     
        if first_match:
            for i in range(each, -1, -1)
                if all(re.match(regex_str, str(f[i])) for regex_str in ['http://hostname:19991/trapeze', 'manager_event=old', 'requesting: ']):
                break

并且调用匹配错误的行(例如,以空格开头的行和其中一个匹配(空格)的实例)。 请问我做错了什么,怎样才能做得更好?

示例输入:

 2016-01-30 00:00:27 DEBUG[-dispatcher-411] ab.talk.this.api.Api - http://hostname:19991/trapeze?manager_id=40178&manager_event=old&apostrophe=2341231231234&_operation=doc dgfgdffb-8123-4f05-ac15-7ac841afad14 requesting:
  HEADERS:
  this-is-a-header: 200*01231231234
  A-Topeka-Firesale: *132*200*01231231234#
  Host: hostname:19991
  Accept: */*
  User-Agent: AHC/2.0
  Timeout-Access: <function1>
 CONTENT:

2015-03-12 00:00:28 DEBUG[-dispatcher-747] ab.talk.this.api.Api - http://hostname:19991/trapeze?manager_id=84942&manager_event=old&apostrophe=2341231231235&_operation=ogle abcdf8237-393f-4c4b-bc46-e184cbf08d9a requesting:
  HEADERS:
  this-is-a-header: 100
  A-Topeka-Firesale: *132*100#
  Host: hostname:19991
  Accept: */*
  User-Agent: AHC/2.0
  Timeout-Access: <function1>
 CONTENT:

1 个答案:

答案 0 :(得分:0)

很不清楚你真正想要的是什么,但经过一番猜测 - 这可能是你想要的吗?

  

2016-12-30 11:02:12 DEBUG [ispatcher-18269] ab.talk.this.api.Api - http://hostname:19991/trapeze?session_id=176764&manager_event=old&apostrophe=2341231231234&_operation=doc 3da48a90-0f4f-4eb3-a241-94a1f05b891b请求:

     bla bla bla

     bla bla bla

     bla bla bla

     

A-Topeka-Firesale:* 132 * 12345 * 2123456789#

在上面的文字中,您想要匹配最后一行。 (你只提供了一个正则表达式,所以我提出了符合条件的一个。)找到该行会引导你到第一行,匹配http://hostname:19991/trapeze?manager_event=oldrequesting:订单,但不是直接相继。

如果我猜对了,这个正则表达式

(http://hostname:19991/trapeze.*?manager_event=old.*?requesting:).*?A-Topeka-Firesale\:\s\*132\*\d{2,5}\*[23]\d{9}\#

应该(可以)为你做。它捕获了第一条(完整的)线,这就是我所理解的就是你所追求的。 (你没有指明它是否是你所追求的特殊情况,如session_id,或者其他什么,但当然可以直接“定位”。)

Check it out here at regex101

请注意,e x ample使用扩展标记允许将正则表达式分割为(稍微)提高可读性,并使用 s 单行标记{{ 1}}匹配换行符。