我有一个脚本,我必须将完整版本的字符串转换为它们的主要部分。例如,我必须将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])
轻松答案 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)]