通常我用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
很高兴举个例子
答案 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'