我有一些像這樣的非結構化資料
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上查看這里的示例。
uj5u.com熱心網友回復:
您可以將此正則運算式與 2 個捕獲組一起使用:
(\w )\s (\[[^]] \]|\w );
正則運算式演示
正則運算式詳情:
(\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']]]
uj5u.com熱心網友回復:
您可以使用
import re, ast
s="""test1 21;
test2 22;
test3 [ 23 ];"""
output = [ast.literal_eval("[" re.sub(r'\s*,\s*(?=])', '', re.sub(r"\w ", r"'\g<0>',", " ".join(x.split())).strip(',;')) "]") for x in s.split('\n')]
print(output)
# => [['test1', '21'], ['test2', '22'], ['test3', ['23']]]
請參閱Python 演示。
詳情:
" ".join(x.split())- 將空格標準化為單詞之間的單個空格re.sub(r"\w ", r"'\g<0>',", ...).strip(',;')- 在單詞周圍添加單引號并在它們后面附加一個逗號,然后去除逗號和分號re.sub(r'\s*,\s*(?=])', '', ...)- 洗掉用可選空格括起來的逗號,后跟一個]字符"[" ... "]"- 用方括號包裹之前的結果ast.literal_eval(...)將字串轉換為串列
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/354296.html
上一篇:用于查找所有貨幣值的正則運算式
下一篇:正則運算式洗掉多個空格后的字符
