Python 提取一个数字及其后的字符串

Python 提取一个数字及其后的字符串,python,regex,scripting,Python,Regex,Scripting,我有一个解析日志文件的脚本,在编程的一部分中,我必须知道消息是否被传输,通过读取这些行,我可以获得消息id,并知道消息是否被传输 01:09:25.258 mta Messages I Doc O:NVS:SMTP/alarm@yyy.xx R:NVS:SMS/+654811 mid:6261 01:09:41.965 mta Messages I Rep 6261 OK, Message received(ID: 26) 08:14:14.469 mta M

我有一个解析日志文件的脚本,在编程的一部分中,我必须知道消息是否被传输,通过读取这些行,我可以获得消息id,并知道消息是否被传输

01:09:25.258 mta   Messages       I Doc O:NVS:SMTP/alarm@yyy.xx R:NVS:SMS/+654811 mid:6261
01:09:41.965 mta   Messages       I Rep 6261 OK, Message received(ID: 26)
08:14:14.469 mta   Messages       I Doc O:NVS:SMTP/alarm@xxxx.en R:NVS:SMS/+654646 mid:6262
08:14:30.630 mta   Messages       I Rep O:NVS:SMTP/alarm@azea.er R:NVS:SMS/+304859 mid:6262
08:14:30.630 mta   Messages       I Rep 6262 Error while transmitting (ID: 28)

我感兴趣的行是第二行和最后一行,我想在它之后提取6261和ok,最后一行也是一样的

/[0-9]{4}(.*)/
,这是否适合你,但我不知道这是否足够通用。根据行id(2548等)是否也可以更短,regexp必须稍微调整,但从所示的4行可以看出这是可行的

在编写正则表达式时,最重要的事情不是仅从“示例”开始,而是从您试图匹配的字符串的“可用假设”开始。我不能可靠地说这个解决方案完美地解决了您的问题,因为我不知道整个问题,因此无法提供一个完美的模式。

/[0-9]{4}(.*)/
符合目的,但我不知道这对您来说是否足够通用。根据行id(2548等)是否也可以更短,regexp必须稍微调整,但从所示的4行可以看出这是可行的


在编写正则表达式时,最重要的事情不是仅从“示例”开始,而是从您试图匹配的字符串的“可用假设”开始。我不能可靠地说这个解决方案完美地解决了您的问题,因为我不知道整个问题,因此无法提供完美的模式。

您不需要regexp。只需在空白处分开几行

>>> line.split(None, 5)
['10:56:45.255', 'Message', 'I', 'Rep', '2559', 'OK, Message received']
由于您只需要ID和消息:

>>> [line.split(None, 5)[-2:] for line in file.readlines()]
[['2548', 'OK'], ['2559', 'OK, Message received'], ['2560', 'Error'], ['2561', 'Transmission... ']]

请注意,消息中的空格不是问题。

您不需要regexp。只需在空白处分开几行

>>> line.split(None, 5)
['10:56:45.255', 'Message', 'I', 'Rep', '2559', 'OK, Message received']
由于您只需要ID和消息:

>>> [line.split(None, 5)[-2:] for line in file.readlines()]
[['2548', 'OK'], ['2559', 'OK, Message received'], ['2560', 'Error'], ['2561', 'Transmission... ']]

请注意,邮件中的空格不是问题。

此文件选项卡是否有分隔符?您自己尝试过任何代码吗?如果是,请显示。此文件选项卡是否有分隔符?您自己尝试过任何代码吗?如果是,请显示它。直到出现一行,
消息
替换为
测试
或其他带有空格的内容。正如我在回答中所说,如果不知道文件格式的详细信息,我们就无法提供完整的工作解决方案,而不知道4行以上的示例。
I
也可能是在其他情况下不存在的可选标记。@Niels:5是有效的,消息可以有任意大小的空格。我的答案适用于给定的格式。OP所说的不支持您关于I可能丢失的说法。这是我问题的更新,因为您可以看到每条消息后都有一个mid,稍后会有一个带有该mid的响应和一个Ok或error,我想做一个测试,以了解消息是否被传输。。。。我已经准备好了一个函数来获取mid以及源和目标,现在我只需要知道是否发送了消息not@SkivlageLatif:好的,我想我明白了。这不是一个好的格式。:-)我可以用regexps来做。@LennartRegebro是的,我不知道怎么做:(直到出现一行,
消息
替换为
测试
或其他带有空格的内容。正如我在回答中所说的,如果不知道文件格式的详细信息,我们就无法提供完整的工作解决方案,而不知道4行样本。
I
也可能是一个可选标记,在其他情况下是不存在的。@Niels:The 5很重要,消息可以有任意大小的空格。我的答案适用于给定的格式。OP所说的内容不支持您关于我可能缺失的说法。下面是我问题的更新,您可以看到每条消息后面都有一个mid,稍后会有一个mid的响应和一个Ok或error,我想做一个补充测试以了解消息是否被传输,…我准备好了一个函数来获取mid以及源和目标,现在我只需要知道消息是否被发送或发送not@SkivlageLatif:好的,我想我明白了。那不是一个好的格式。:-)我可以用regexps来做。@LennartRegebro是的,我不知道怎么做:(