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

如何在Python中用一个正则表达式解析此字符串,python,regex,Python,Regex,我需要解析这个字符串,Python中只有一个正则表达式。对于每个组,我需要将值保存在特定字段中问题是一个或多个参数可能丢失或顺序不同。(即域66666 ip nonce,中间部分缺失) 3249dsf 2013-02-10T06:44:30.666821+00:00域常数66666同步:[127.0.0.1]请求:pubvalue=kjiduensofksidoposiw&change=09872534&value2=jdmcnhj&counter=232&value3=2&nonce=7896

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

3249dsf 2013-02-10T06:44:30.666821+00:00域常数66666同步:[127.0.0.1]请求:pubvalue=kjiduensofksidoposiw&change=09872534&value2=jdmcnhj&counter=232&value3=2&nonce=7896089hujoiuh098h

我需要分配:

  • 时间=2013-02-10T06:45:30.666821+00:00
    (固定格式)
  • domain=domain
    (字符串)
  • code=66666
    (整数)
  • ip=127.0.0.1
    (字符串)
  • pubvalue=kjiduensofksidoposiw
    (固定长度的字符串)
  • nonce=7896089hujoiuhuh098h
    (字符串)
编辑

这是一个关于字符串如何变化的示例: 123dsf 2014-01-11T06:49:30.666821+00:00谷歌常数12356同步:[192.168.0.1]请求:pubvalue=fgggggeesidoposiw&nonce=7896089hujoiuh098h


提前感谢您为我指路。

使用一个正则表达式解析整个字符串可能不是一个好主意。 但我认为解决方案是使用
命名组
(请参阅:。
(?Pbla)

例如,您可以将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()
重新导入
str=“3249dsf 2013-02-10T06:44:30.666821+00:00域常数66666同步:[127.0.0.1]请求:pubvalue=kjiduensofksidoposiw&change=09872534&value2=jdmcnhj&counter=232&value3=2&nonce=7896089hujoiuh098h”
打印检索(\[(?P\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\]),str.groupdict()
只需使用匹配其他内容所需的模式扩展此正则表达式

您可以通过将
放在组的主题后面,使组成为可选的,例如:
(?Ppattern)?
。如果模式无法匹配,则dict中的元素将为


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

使用一个正则表达式解析整个字符串可能不是一个好主意。 但我认为解决方案是使用
命名组
(请参阅:。
(?Pbla)

例如,您可以将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()
重新导入
str=“3249dsf 2013-02-10T06:44:30.666821+00:00域常数66666同步:[127.0.0.1]请求:pubvalue=kjiduensofksidoposiw&change=09872534&value2=jdmcnhj&counter=232&value3=2&nonce=7896089hujoiuh098h”
打印检索(\[(?P\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\]),str.groupdict()
只需使用匹配其他内容所需的模式扩展此正则表达式

您可以通过将
放在组的主题后面,使组成为可选的,例如:
(?Ppattern)?
。如果模式无法匹配,则dict中的元素将为


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

当您需要从一个字符串中以可变顺序获取不同项目的值时,这不是一个正则表达式的工作。为什么对单个正则表达式有这样的要求?如果字符串不是正则的,那么您尝试应用一个正则表达式就是在自找麻烦需要了解更多关于如何解析字符串的详细信息。还请提供代码以进行调整。@NoobTom:我认为这是错误的!因为分组、反向引用和查找aheads、-behinds以及所有这些内容都将非常缓慢,因为您的整个文件将在一个步骤中解释。我认为会有很多回溯,这会让它变慢。@NoobTom,我不认为你应该在每个术语的整个模式上调用
re.match
。可能最好有中间步骤,比如:在空白处拆分字符串,在
上拆分请求,然后检查术语中你想要的内容。如果你能准确定义将要更改的内容以及需要更改的内容,那么不,这将有助于您制定最有效的算法。例如,如果时间始终是第二项,则您可以采用该项而不是对其进行测试。当您需要以可变顺序从具有可变数量的不同项的字符串中获取值时,这不是一个正则表达式的任务。为什么对单个正则表达式有此要求?如果字符串不是正则的,那么您试图对其应用一个正则表达式是在自讨苦吃。需要更多详细信息来说明要分析的字符串如何变化。还请提供代码以进行调整。@NoobTom:我会说这是错误的!因为分组和反向引用以及“向前看”、“向后看”以及所有这些东西将非常缓慢,因为se您的整个文件将在一个步骤中解释。我认为会有很多回溯,这会使它变慢。@NoobTom,我认为您不应该在每个术语的整个模式上调用
re.match
。可能最好有中间步骤,例如:在空白处拆分字符串,在
上拆分请求,然后检查你想要的东西的术语。如果你能准确定义什么会改变,什么不会改变,这将帮助你制定最有效的算法。例如,如果时间总是第二个术语,你可以用它代替测试。谢谢你,我不知道命名组!这对分配匹配非常有帮助到一个变量!那么,看看我编辑过的答案:谢谢你,我不知道命名为g