使用regex sub在字符串中添加空格

时间:2016-07-28 07:52:18

标签: python regex

我有一个字符串,我想分成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

第二次编辑:有没有更好的方式(或任何方式......)在没有正则表达式的情况下执行

4 个答案:

答案 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)

Python demo

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']