Python正则表达式插入“。”在字符串的前两个字符之后

时间:2015-08-07 09:41:31

标签: python regex

鉴于:"2276514"

预期:"22.76514"

请解释它是如何运作的。

2 个答案:

答案 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)),但不足以产生影响。