要插入的Python正则表达式"&引用;在字符串的前两个字符之后
给定:要插入的Python正则表达式"&引用;在字符串的前两个字符之后,python,regex,Python,Regex,给定:“2276514” 应为:“22.76514” 请解释它是如何工作的。切片和连接要容易得多,但如果需要正则表达式: s= "2276514" import re print(re.sub("(\w{2})",r"\1.",s,1)) \w{2}只查找2个字母数字字符,r“\1。”使用捕获组在末尾添加一个句点作为替换值,s显然是要替换的字符串,1是要进行多少替换 切片的效率要高得多: In [37]: s*= 1000 In [38]: timeit s[:2]+"."+s[2:] 10
“2276514”
应为:“22.76514”
请解释它是如何工作的。切片和连接要容易得多,但如果需要正则表达式:
s= "2276514"
import re
print(re.sub("(\w{2})",r"\1.",s,1))
\w{2}
只查找2个字母数字字符,r“\1。”
使用捕获组在末尾添加一个句点作为替换值,s
显然是要替换的字符串,1
是要进行多少替换
切片的效率要高得多:
In [37]: s*= 1000
In [38]: timeit s[:2]+"."+s[2:]
1000000 loops, best of 3: 860 ns per loop
In [39]: timeit r.sub(r"\1.",s,1)
100000 loops, best of 3: 6.73 µs per loop
使用以下测试脚本:
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
不管怎样,regex都输了;您可以通过预编译模式(例如,put
pattern=re.compile(r'^(\d{2})
作为默认参数,并在函数中使用pattern.sub(r'\1',s)
)来节省一些时间,但这还不足以产生差异。不需要regex
。您可以使用简单的字符串方法通过st[:2]+“+st[2:10]的方式获得解决方案,但我需要一些自定义,因为我有很多字符串需要这样做,因此我需要在regxTrynewst=st[:2]+”。+st[2://code>投票结束,作为非主题:“请为我写一些代码”谢谢你的解决方案问题已经解决了,但是你能解释一下第二个和第三个参数吗?我可以知道我使用regx和普通字符串处理时的性能吗explanation@HarishTM加入((s[:2],s[2:])
?;)@sebastian的速度略快于当前的字符串
,但在第二种情况下仍然没有超过数值
。