使用正则表达式去除不必要的空格以获得期望的输出。

3

我有几个这样的非结构化数据

test1     21;
 test2  22;
test3    [ 23 ];

我想去掉不必要的空格,并将其转换为每行两项的列表,预期输出应如下所示。
['test1', '21']
['test2', '22']
['test3', ['23']]

现在,我正在使用这个正则表达式sub方法来删除不必要的空格

re.sub(r"\s+", " ", z.rstrip('\n').lstrip(' ').rstrip(';')).split(' ')

现在的问题是它能够将不必要的空格替换为单个空格,这很好。但我在第三个例子中遇到了问题,在开放和关闭括号之后和之前有空格,我想要移除它们。但是使用上面的正则表达式我无法做到。

这是我目前得到的输出。

['test1', '21']
['test2', '22']
['test3', '[', '23', ']']

您可以在pythontutor中查看示例。

(本文为技术文献翻译,涉及Python代码)

为什么不在之前移除方括号? - Wiktor Stribiżew
抱歉,是我的错。实际上我需要那些方括号。让我更新一下帖子。再次道歉。 - Tony Montana
这不是正则表达式的可能结果,因为['23']是由数组生成的结果。正则表达式并不是其强项。 - sln
2个回答

2

您可以使用以下带有2个捕获组的正则表达式:

(\w+)\s+(\[[^]]+\]|\w+);

I am happy to help! Here is the translated text:

正则表达式演示

正则表达式细节:

  • (\w+):匹配至少1个单词字符并捕获到第一组。
  • \s+:匹配至少1个空格。
  • (\[[^]]+\]|\w+):匹配[...]格式的字符串或者单词,并捕获到第二组。
  • ;:匹配分号;

代码:

>>> import re
>>> data = '''
... test1     21;
...  test2  22;
... test3    [ 23 ];
... '''
>>> res = []
>>>
>>> for i in re.findall(r'(\w+)\s+(\[[^]]+\]|\w+);', data):
...     res.append([ i[0], eval(re.sub(r'^(\[)\s*|\s*(\])$', r'\1"\2', i[1])) if i[1].startswith('[') else i[1] ])
...
>>> print (res)
[['test1', '21'], ['test2', '22'], ['test3', ['23']]]

1

您可以使用

import re
 
x = "test1     21"
y = "     test2  22"
z = "    test3    [ 23 ]"
 
for a in [x, y, z]:
    print(re.sub(r"(?<![^[\s])\s+|\s+(?=])", "", a.rstrip('\n').lstrip(' ').rstrip(';')).split(' '))

请查看Python演示。输出结果如下:
['test1', '21']
['test2', '22']
['test3', '[23]']

细节:

  • (?<![^[\s])\s+ - 一个或多个空格,前面是 [ 字符、空格或字符串的开头
  • | - 或者
  • \s+(?=]) - 一个或多个空格,后面是 ] 字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接