从一行获取子字符串

时间:2015-01-13 12:39:45

标签: python python-2.7

通常我用C#写

我怎样才能剪一根绳子? 我有这条线:

Line 58: Oct  6 16:58:03 INTEG_245 sia_server[6830]: DbsinkConsumer.cc:262: (D) <video> 07920E: Got msg_idx=28 for evt_id=436752

我需要削减28?

这是我使用的代码:

  if (str(line).find("msg_idx=") > 0):  
    msg_id = line[line.index("Got"):line.index("For")]

出现错误:

sg_id = line[line.index("Got"):line.index("For")]
ValueError: substring not found

很高兴举个例子

2 个答案:

答案 0 :(得分:4)

您可以使用regular expressions

>>> import re
>>> s= 'Line 58: Oct  6 16:58:03 INTEG_245 sia_server[6830]: DbsinkConsumer.cc:262: (D) <video> 07920E: Got msg_idx=28 for evt_id=436752'
>>> print int(re.search(r'msg_idx=(\d+)', s).group(1))
28

...其中re.search()搜索表达式'msg_idx=',前面有r,表示它是带有转义序列的RE,后跟捕获组{{1 },可以在以后引用。 ( ) inside指的是至少一个数字字符。然后\d+引用位置1处的指定捕获组。

答案 1 :(得分:1)

这不是一个使用line.index(example_word)的好方法,因为你的txext和索引中有很多example_word只返回第一个匹配的索引。您可以使用re.sub和肯定look-behind作为更有效的方式:

>>> s="Line 58: Oct  6 16:58:03 INTEG_245 sia_server[6830]: DbsinkConsumer.cc:262: (D) <video> 07920E: Got msg_idx=28 for evt_id=436752"
>>> re.sub(r'(?<=msg_idx=)\d+','',s)
'Line 58: Oct  6 16:58:03 INTEG_245 sia_server[6830]: DbsinkConsumer.cc:262: (D) <video> 07920E: Got msg_idx= for evt_id=436752'

如果您想获得28,可以使用re.search

>>> s="Line 58: Oct  6 16:58:03 INTEG_245 sia_server[6830]: DbsinkConsumer.cc:262: (D) <video> 07920E: Got msg_idx=28 for evt_id=436752"
>>> re.search(r'(?<=msg_idx=)\d+',s).group(0)
'28'
#or just use grouping :
>>> re.search(r'msg_idx=(\d+)',s).group(1)
'28'