从字符串中提取数字,同时保留空格

时间:2018-01-30 01:21:20

标签: regex string python-3.x

我有一些像这样的字符串

'    12    2    89   29   11    92     92     10'

(所有数字都是正整数,所以没有-而没有.),我想从中提取所有数字,编辑一些数字,然后将它们全部放在一起相同的空白。例如,如果我将数字11更改为22,我希望最终字符串为

'    12    2    89   29   22    92     92     10'

我做了一些搜索,大多数问题忽略了空白,只关心数字。我试过了

match = re.match((\s*(\d+)){8}, str)

match.group(0)为我提供了整个字符串,match.group(1)为我提供了第一个匹配\ 12(我添加了\,否则网站将不会显示前导空格),match.group(2)给了我12。但是之后它不会给我任何数字,任何高于2的索引都会给我一个错误。我不认为我的方法是正确的,正确的做法是什么?

我刚试过re.split('(\d+)', str),这似乎就是我需要的。

2 个答案:

答案 0 :(得分:1)

我建议使用non-capturing groups的正则表达式来获取“空格”列表。零件和编号'部分:

In [15]: text = '    12    2    89   29   11    92     92     10'
In [16]: parts = re.findall('((?: +)|(?:[0-9]+))', text)
In [17]: parts
Out[17]: ['    ', '12', '    ', '2', '    ', '89', '   ', '29', '   ',
  '11', '    ', '92', '     ', '92', '     ', '10']

然后你可以这样做:

for index, part in enumerate(parts):
    if part == '11':
        parts[index] = '22'
replaced = ''.join(parts)

(或者你想做的任何匹配和替换)。

答案 1 :(得分:0)

将所有数字与空格匹配,更改所需数字并加入数组。

import re

newNum = '125'
text = '    12    2    89   29   11    92     92     10'
                                              ^^
marray = re.findall(r'\s+\d+', text)
marray[6] = re.sub(r'\d+', newNum, marray[6])

print(marray) 

['    12', '    2', '    89', '   29', '   11', '    92', '     125', '     10']