【发布时间】:2016-07-28 07:52:17
【问题描述】:
我有一个字符串,我想将其拆分为两位数。我尝试像这样使用正则表达式:
import re
s = "123456789"
t = re.sub('..', ".. ", s)
print(t)
我希望得到12 34 56 78 9,但我得到了'.. .. .. .. 9'。 9 不会打扰我,因为我知道我会有偶数位数,但我如何告诉 re.sub 不要用点替换实际数字?
使用 python shell 3.5.1
编辑
检查了所有 3 个答案,它们都有效,但 findall 似乎更快(并且更优雅的 IMO ;p):
import time
import re
s = "43256711233214432"
i = 10000
start = time.time()
while i:
i -= 1
re.sub('(..)', r"\1 ", s)
end = time.time()
elapsed = end - start
print("using r\"\\1 \" : ", elapsed)
i = 10000
start = time.time()
while i:
re.sub('..', r"\g<0> ", s)
i -= 1
end = time.time()
elapsed = end - start
print("using r\"\g<0> \" : ", elapsed)
i = 10000
start = time.time()
while i:
' '.join(re.findall(r'..|.', s))
i -= 1
end = time.time()
elapsed = end - start
print("using findall : ", elapsed)
使用 r"\1" : 0.25461769104003906
使用 r"\g" : 0.09374403953552246
使用 findall : 0.015610456466674805
第二次编辑:有没有更好的方法(或任何方法......)这样做没有正则表达式?
【问题讨论】:
-
你的时序分析很奇怪。
\1和\g<0>做的差不多,应该同样快。使用 IPython 的%timeit函数,sub方法都为我提供了 8.5µs,findall为 2.0µs,range(0, len, 2)为 1.5µs -
@tobias_k 不知道...我运行这个脚本大约 10 次,每次 "findall" 是第 1 次,"g" 第 2 次和 "\1" 第 3 次
-
如果你以不同的顺序测试它们会发生什么,首先是
\g,然后是\1?findall是最快的(range除外),无需争论。顺便说一句,当我运行你的脚本时,它更接近于%timeit,\g和\1几乎相同。 -
我看到了细微的变化,但不确定它们......我让它连续运行了 10 次,并且做得很平均。 g 两次都快了 0.2