1

我需要解析这个字符串,在 Python 中只有一个正则表达式。对于每个组,我需要将值保存在特定字段中。问题是一个或多个参数可能丢失或顺序不同。(即domain 66666 ip nonce,缺少中间部分)

3249dsf 2013-02-10T06:44:30.666821+00:00 domain constant 66666 sync:[127.0.0.1] Request: pubvalue=kjiduensofksidoposiw&change=09872534&value2=jdmcnhj&counter=232&value3=2&nonce=7896089hujoiuhiuh098h

我需要分配:

  • time=2013-02-10T06:45:30.666821+00:00(常量格式)
  • domain=domain(细绳)
  • code=66666(整数)
  • ip=127.0.0.1(细绳)
  • pubvalue=kjiduensofksidoposiw(固定长度的字符串)
  • nonce=7896089hujoiuhiuh098h(细绳)

编辑

这是字符串如何变化的示例: 123dsf 2014-01-11T06:49:30.666821+00:00 google constant 12356 sync:[192.168.0.1] Request: pubvalue=fggggggeesidoposiw&nonce=7896089hujoiuhiuh098h

提前谢谢你给我指路。

4

1 回答 1

1

使用一个正则表达式来解析整个字符串可能不是一个好主意。但我认为解决方案是使用named groups(请参阅:Regex Tutorial 上的命名组Named groups可以通过以下方式捕获(?P<nameofgroup>bla)

因此,您可以将例如 ip 与:

import re
str = "3249dsf 2013-02-10T06:44:30.666821+00:00 domain constant 66666 sync:[127.0.0.1] Request: pubvalue=kjiduensofksidoposiw&change=09872534&value2=jdmcnhj&counter=232&value3=2&nonce=7896089hujoiuhiuh098h"
print re.search("\[(?P<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\]", str).groupdict()

只需使用匹配其他内容所需的模式扩展此正则表达式即可。

并且您可以通过?在组的括号后面放置 a 来使组成为可选的,例如:(?P<ip>pattern)?。如果无法匹配模式,则 dict 中的元素将为None.

但请注意:仅在一个Regex中执行此操作并不是一个好主意。它会很慢(因为回溯和其他东西)并且正则表达式会很长而且维护起来很复杂!

于 2013-02-21T09:32:07.943 回答