从字符串中提取特定字符

时间:2013-03-31 23:39:54

标签: python string

i= "March 31st 2013 ntp[22123] Time server offset -.00354 sec"

i= "March 1st 2013 ntp[22485] Time server offset -.0070 sec"

字符串似乎相同,但一旦进入,字符数将会不同。如果我尝试仅提取字符串"-.0070 sec" with i=i [-11:]的最后一部分,那么它将无效。

我想知道我是否可以搜索单词"offset",在字符串中找到它的位置,并使用它来消除字符串的其余部分以保留"-.00354 sec" or "-.0070 sec"

例如,"March 31st 2013 Time server offset -.00354 sec"中有46个字符,offset是字符串第28位的开头。从字符串开头总共34个字符将被删除。

4 个答案:

答案 0 :(得分:4)

text.rfind将索引返回到最后一次出现的offset

In [162]: text = "March 1st 2013 ntp[22485] Time server offset -.0070 sec"

In [181]: text.rfind('offset')
Out[181]: 38

所以你可以在'offset '之后剪切字符串:

In [183]: text[text.rfind('offset ')+len('offset '):]
Out[183]: '-.0070 sec'

或者,您可以使用str.rpartitiontext分成三部分,然后选择第三部分(和最后一部分):

In [179]: text.rpartition('offset ')
Out[179]: ('March 1st 2013 ntp[22485] Time server ', 'offset ', '-.0070 sec')
In [169]: text.rpartition('offset ')[-1]
Out[169]: '-.0070 sec'

或者,您可以使用str.rsplit在最后一次出现'offset '时拆分字符串:

In [180]: text.rsplit('offset ', 1)
Out[180]: ['March 1st 2013 ntp[22485] Time server ', '-.0070 sec']
In [172]: text.rsplit('offset ', 1)[1]
Out[172]: '-.0070 sec'

1中的text.rsplit('offset ', 1)告诉rsplittext分成最多1个位置。


rfindrsplitrpartition分别对右侧的字符串进行操作。因此,即使text包含子串'offset '两次,它们仍会找到子串的最后一次出现。

答案 1 :(得分:0)

将单词offset上的字符串拆分,然后使用尾随空格:

line.split('offset ', 1)[-1]

这会占用该词之后的所有内容。

演示:

>>> text = "March 1st 2013 ntp[22485] Time server offset -.0070 sec"
>>> text.split('offset ', 1)[-1]
'-.0070 sec'

答案 2 :(得分:0)

您可以使用正则表达式:

import re

strings=['March 31st 2013 ntp[22123] Time server offset -.00354 sec', 
        'March 1st 2013 ntp[22485] Time server offset -.0070 sec']

for s in strings:
    print re.search(r'offset -(\.\d+) sec$',s).group(1)     

打印:

.00354
.0070

如果要包含-

,请移动括号
print re.search(r'offset (-\.\d+) sec$',s).group(1) 

或者,如果是可选符号,请执行以下操作:

strings=['March 31st 2013 ntp[22123] Time server offset -.00354 sec', 
        'March 1st 2013 ntp[22485] Time server offset -.0070 sec',
        'March 1st 2013 ntp[22485] Time server offset .0070 sec']

for s in strings:
    print re.search(r'offset ((?:-)?\.\d+) sec$',s).group(1)      

使用$锚点,它只返回字符串中的最后一个(如果找到)。

答案 3 :(得分:0)

你可以使用这样的正则表达式:

>>> i = "March 31st 2013 ntp[22123] Time server offset -.00354 sec"
>>> pattern = re.compile('(offset)(.+)$')
>>> offset  = pattern.findall(s)[0][1]
>>> print offset
 -.00354 sec