Regex ta捕获带逗号的十进制数

ogq8wdun  于 2022-12-24  发布在  其他
关注(0)|答案(2)|浏览(129)

我有一个名单的一部分如下:

energy = [... , 'Wind 1,00 Water 7,36 Renewable Cogeneration 9,71 Other Renewables 9,65 Solid Waste 2,80',
 'Fossil Cogeneration 2,17 ',
 'Natural Gas 56,35 Coal 9,73 Nuclear 0,64 ', ...]

列表的其余部分与此部分无关,我需要将其转换为 Dataframe ,如下所示:

key   value
0                      Wind    1.00          
1                     Water    7.36         
2    Renewable Cogeneration    9.71          
3          Other Renewables    9.65      
4               Solid Waste    2.80      
5       Fossil Cogeneration    2.17
6               Natural Gas   56.35
7                      Coal    9.73
8                   Nuclear    0.64

我不能直接连接字符串,因为这是一个程序,可以产生这些字符串在许多格式。可以是1至4个字符串在列表中,并没有在一个字符串中定义的键数,他们可以有点随机分配给一个字符串。
我有下面的代码段来生成另一个字符串,该字符串稍后将用于创建 Dataframe :

import re

table_energy = []

to_find = ['Wind', 'Water', 'Renewable Cogeneration', 'Other Renewable', 'Solid Waste', 'Fossil Cogeneration', 'Natural Gas', 'Coal', 'Nuclear']
chars_to_find = ['Wind', 'Water', 'Renewable Cogeneration', 'Renewable', 'Waste', 'Fossil Cogeneration', 'Gas', 'Coal', 'Nuclear']
key = ['Wind', 'Water', 'Ren_Cog', 'Other_Ren', 'Sol_Waste', 'Fossil_Cog', 'Nat_Gas', 'Coal', 'Nuclear']

for i in range(len(energy))

    for j in range(len(to_find)):

        if to_find[j] in energy[i]:

           aux_row= energy[i]+' '
           expression = chars_to_find[j]+' (.*) '
           result = re.search(expression, aux_row)
           print(result.group(1))
           table_energy.append('key_'+key[j]+' '+result.group(1))

以下是输出:

['key_Wind 1,00 Water 7,36 Renewable Cogeneration 9,71 Other Renewable 9,65 Solid Waste 2,80',  
'key_Water 7,36 Renewable Cogeneration 9,71 Other Renewable 9,65 Solid Waste 2,80',  
'key_Ren_Cog 9,71 Other Renewable 9,65 Solid Waste 2,80',  
'key_Other_Ren 9,65 Solid Waste 2,80',  
'key_Sol_Waste 2,80',  
'key_Fossil_Cog 2,17',  
'key_Nat_Gas 56,35 Coal 9,73 Nuclear 0,64',  
'key_Coal 9,73 Nuclear 0,64',  
'key_Nuclear 0,64']

我需要每个元素只由键和值组成。我明白这是正则表达式的问题,但我尝试了许多方法,它都不起作用。
任何帮助都很感激,谢谢:)

cyej8jka

cyej8jka1#

import re
import pandas as pd

data = []
for i in energy:
    # Splits data based on the space after the value.
    key_value_pair = re.split(r'(?<=\d)\s', i)

    for key_value in key_value_pair:
        # Splits key and value based on the space before the value.
        # Ads list of key and value to the result list.
        data.append(re.split(r'(?:\s)(?=\d)', key_value))

# Drops None values caused by the space in the end of the examples 
# such as 'Fossil Cogeneration 2,17 '. 
pd.DataFrame(data, columns=['key', 'value']).dropna()

| | 钥匙|价值|
| - ------|- ------|- ------|
| 无|风|1.00美元|
| 1个|水|七、三十六|
| 第二章|可再生热电联产|九、七十一|
| 三个|其他可再生能源|九点六五|
| 四个|固体废弃物|二、八十|
| 五个|化石热电联产|二、十七|
| 七|天然气|五十六、三十五|
| 八个|煤炭|九、七十三|
| 九|核武器|0.64|

fjaof16o

fjaof16o2#

您可以使用带有2个捕获组和re. findall的模式,它将返回带有2个值的元组列表(2个捕获组值)
然后,您可以将元组附加到table_energy,然后将其提供给Dataframe。

(\S.*?)\s+(\d+,\d+)

模式匹配:

  • (\S.*?)捕获组1,匹配单个非空白字符后跟任意字符,尽可能少
  • \s+匹配1辆以上的whitspace汽车
  • (\d+,\d+)捕获组2,匹配1+位数,和1+位数

Regex demo|Python demo
示例

import re
import pandas as pd

energy = ['Wind 1,00 Water 7,36 Renewable Cogeneration 9,71 Other Renewables 9,65 Solid Waste 2,80',
          'Fossil Cogeneration 2,17 ',
          'Natural Gas 56,35 Coal 9,73 Nuclear 0,64']
table_energy = []
pattern = r"(\S.*?)\s+(\d+,\d+)"
for i in energy:
    for tup in re.findall(pattern, i):
        table_energy.append(tup)

res = pd.DataFrame(table_energy, columns=['key', 'value'])

print(res)

产出

key  value
0                    Wind   1,00
1                   Water   7,36
2  Renewable Cogeneration   9,71
3        Other Renewables   9,65
4             Solid Waste   2,80
5     Fossil Cogeneration   2,17
6             Natural Gas  56,35
7                    Coal   9,73
8                 Nuclear   0,64

相关问题