鉴于:"2276514"
预期:"22.76514"
请解释它是如何运作的。
答案 0 :(得分:0)
切片和连接要容易得多,但如果你想要一个正则表达式:
s= "2276514"
import re
print(re.sub("(\w{2})",r"\1.",s,1))
\w{2}
查找正好2个字母数字字符,r"\1."
使用捕获组添加句点作为替换值,s
显然是要替换的字符串{{1}是要做多少次替换。
切片效率更高:
1
答案 1 :(得分:0)
使用以下测试脚本:
import re
def string(s):
return '{}.{}'.format(s[:2], s[2:])
def regex(s):
return re.sub(r'^(\d{2})', r'\1.', s)
def numerical(s):
return str(int(s) / (10 ** (len(s) - 2)))
if __name__ == '__main__':
from textwrap import dedent
from timeit import timeit
funcs = ('string', 'regex', 'numerical')
test = '{}(s)'
setup = dedent('''
from __main__ import {}
s = "2276514"
assert {}
'''.format(
', '.join(funcs),
' == '.join(test.format(func) for func in funcs),
)
)
for func in funcs:
print(func, timeit(test.format(func), setup=setup))
事实证明,使用正则表达式的效率远低于数学运算或切割字符串:
string 0.913286265126315
regex 8.614692108100677
numerical 2.954279778595833
如果你真的想要这个数字(即将float
添加到前两个并从最后一个中删除str
),那么数值方法最快:
string 1.449586457505659
regex 9.255363527420872
numerical 0.9225037999760559
无论哪种方式,正则表达式都会失败;您可以通过预编译模式来节省一些时间(例如,将pattern=re.compile(r'^(\d{2})')
作为默认参数并在函数中使用pattern.sub(r'\1.', s)
),但不足以产生影响。