如何在Python中使用一个正则表达式解析此字符串

时间:2013-02-21 09:15:04

标签: python regex

我需要解析这个字符串,在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]要求:pubvalue = fggggggeesidoposiw& nonce = 7896089hujoiuhiuh098h

提前感谢您给我指路。

1 个答案:

答案 0 :(得分:1)

使用一个正则表达式解析整个字符串可能不是一个好主意。 但我认为解决方案是使用named groups(请参阅:Named groups on Regex TutorialNamed 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()

只需使用您需要的模式扩展此正则表达式以匹配其他内容。

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

但请注意:一个正则表达式 一个好主意。这将是缓慢的(因为回溯和东西)和正则表达将是漫长而复杂的维护!