从完整版本字符串中获取主要版本的子字符串

时间:2013-08-18 13:54:07

标签: python string split

我有一个脚本,我必须将完整版本的字符串转换为它们的主要部分。例如,我必须将1.2.3.4.5.6.7转换为1.2

目前我使用的是:'.'.join(s.split('.', 2)[:-1])

>>> s = '1.2.3.4.5.6.7'
>>> '.'.join(s.split('.', 2)[:-1])
'1.2'

哪个工作正常。但它非常难看,我希望有更好的方法。

修改:

  • 表现是一个问题,所以表现糟糕的答案(尽管看起来很不错)对我来说并不好。
  • '.'.join(s.split('.', 2)[:-1])也可以'.'.join(s.split('.', 2)[:2])轻松

4 个答案:

答案 0 :(得分:4)

如果预编译正则表达式,使用正则表达式并不是一种矫枉过正。因此

import re
pattern = re.compile(r'^[0-9]+\.[0-9]+')

# ... later ...

version = '1.2.3.4.5.6.7'

def get_version(s):
    m = pattern.search(s)
    if m:
        return m.group()


print get_version(version)

这也将确保您的版本与格式匹配。

答案 1 :(得分:2)

使用regex

>>> s = '1.2.3.4.5.6.7'
>>> re.search(r'(\d+\.\d+)', s).group()
'1.2'

时间比较:

>>> r = re.compile(r'^(\d+\.\d+)')

>>> s = '100.21.3.4.5.6.7'
>>> %timeit r.search(s).group()
100000 loops, best of 3: 1.43 us per loop
>>> %timeit '.'.join(s.split('.')[:2])
1000000 loops, best of 3: 2.32 us per loop
>>> %timeit '.'.join(s.split('.', 2)[:-1])
100000 loops, best of 3: 1.28 us per loop

>>> s = '100.21.3.4.5.6.7'*100
>>> %timeit r.search(s).group()
1000000 loops, best of 3: 1.96 us per loop
>>> %timeit '.'.join(s.split('.')[:2])
10000 loops, best of 3: 40.4 us per loop
>>> %timeit '.'.join(s.split('.', 2)[:-1])
100000 loops, best of 3: 2.01 us per loop

>>> s = '100.21.3.4.5.6.7'*1000
>>> %timeit r.search(s).group()
1000000 loops, best of 3: 1.94 us per loop
>>> %timeit '.'.join(s.split('.')[:2])
1000 loops, best of 3: 314 us per loop
>>> %timeit '.'.join(s.split('.', 2)[:-1])
100000 loops, best of 3: 6.76 us per loop

>>> s = '100.21.3.4.5.6.7'*10000
>>> %timeit r.search(s).group()
100000 loops, best of 3: 1.42 us per loop
>>> %timeit '.'.join(s.split('.')[:2])
100 loops, best of 3: 5.3 ms per loop        #millisecond 
>>> %timeit '.'.join(s.split('.', 2)[:-1])
10000 loops, best of 3: 104 us per loop
基于

re.findall的解决方案也会变慢,因为它需要对整个字符串进行迭代,而re.search在第一次匹配时停止。

答案 2 :(得分:0)

另一种方式可以是'.'.join(s.split('.')[:2]),但它非常相似。我认为没有其他有效的可能性:你必须按点分割,然后只选择两个第一个元素。

这个解决方案(或你的,相同的)都很好。只是避免使用正则表达式,这对于这种任务来说太过分了。

答案 3 :(得分:0)

另一种方法,寻找第二个点并在其上切割字符串:

s[:s.index('.', s.index('.')+1)]

It should be about as fast as the split and regex versions