4

我有一个脚本,我必须在其中将完整版本的字符串转换为它们的主要部分。例如,我必须转换1.2.3.4.5.6.71.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

4 回答 4

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)

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

于 2013-08-18T15:04:19.883 回答
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在第一次匹配时停止。

于 2013-08-18T13:57:27.287 回答
0

A different approach, looking for the second dot and slicing the string on it:

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

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

于 2013-08-18T16:10:01.813 回答
0

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

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

于 2013-08-18T13:57:29.397 回答