我有一个字符串,我想分成2位数字。我试过像这样使用正则表达式:
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&#34; \ 1&#34; :0.25461769104003906
使用r&#34; \ g&lt; 0&gt; &#34; :0.09374403953552246
使用findall:0.015610456466674805
第二次编辑:有没有更好的方式(或任何方式......)在没有正则表达式的情况下执行?
答案 0 :(得分:4)
您也可以使用>>> s = "123456789"
>>> ' '.join(re.findall(r'..|.', s))
'12 34 56 78 9'
>>>
,
r'..|.'
..
正则表达式匹配两个字符或一个字符(第一个首选项转到.
然后not()
)
答案 1 :(得分:3)
您可以在替换字符串模式中使用\g<0>
反向引用来引用整个匹配项(您无法使用正则表达式模式):
re.sub('..', r"\g<0> ", s)
import re
s = "12345678"
print(re.sub('..', r"\g<0> ", s))
请参阅re.sub
reference:
反向引用
\g<0>
替代RE匹配的整个子字符串。
答案 2 :(得分:2)
在正则表达式中,.
表示任何字符。在替换文本中,它表示一个句点。如果你想在你的正则表达式中捕获字符作为一个组,你需要在它们周围放置parens。您可以使用\1
>>> re.sub('(..)', r"\1 ", s)
'12 34 56 78 9'
答案 3 :(得分:0)
您也可以使用列表推导,
>>> s='123456789'
>>> res=[s[index:index+2] for index,x in enumerate(s) if index % 2==0]
['12', '34', '56', '78', '9']