用于替换字符串中第二次出现的单词的 Regex 表达式是什么?

What is the Regex expression for substituting every second occurrence of a word in a string?

字符串如下,

LOCATION AQI CATEGORY RANGE Dhaka a 251 VERY UNHEALTHY 195-306 Chittagong b 122 CAUTION 82-162 Gazipur c 237 VERY UNHEALTHY - Narayanganj c 335 EXTREMELY UNHEALTHY - Sylhetc c 159 UNHEALTHY - Khulna c DNA DNA - Rajshahi c 156 UNHEALTHY - Barisal c 192 UNHEALTHY - Savar DNA DNA Muradpur 126 CAUTION Cumilla 157 DNA Sandip DNA WARNING

在这里,在每个混合大小写的词之后,NULL/None 值表示为 AQI 值和气候条件的 DNA。我的目标是创建一个数据框,如下所示,

LOCATION AQI
Dhaka 172
Chittagong 125
Gazipur 178
... ...
Khulna 0
... ...

我只需要上面table中看到的具体内容。另外,请注意,对于我的模型,只有 AQI 的 DNA 被替换为数值,例如 0。

我的方法结合用户 Corralien 的方法

re.sub("(\b[A-Z]+\b)|(\d+-\d+)|(\s\w\s)|(-)",' ')

试试这个:

import re
import pandas as pd

test_str = "LOCATION AQI CATEGORY RANGE Dhaka 172 UNHEALTHY Chittagong 125 CAUTION Gazipur 178 UNHEALTHY Narayanganj 174 UNHEALTHY Sylhetc 129 CAUTION Khulna DNA DNA Rajshahi 118 CAUTION Barisal 118 CAUTION Savar DNA DNA Muradpur 126 CAUTION Cumilla 157 DNA Sandip DNA WARNING"

match = re.findall('([A-Za-z]+)\s((\d+)|(DNA))', test_str)
match = [val[:2] for val in match]

df = pd.DataFrame(match, columns =['LOCATION', 'AQI'])
df["AQI"].replace({"DNA":0}, inplace=True)
print(df)

输出:

       LOCATION  AQI
0         Dhaka  172
1    Chittagong  125
2       Gazipur  178
3   Narayanganj  174
4       Sylhetc  129
5        Khulna    0
6      Rajshahi  118
7       Barisal  118
8         Savar    0
9      Muradpur  126
10      Cumilla  157
11       Sandip    0

第一步是提取单个值。我假设数据集中没有包含多个单词的项目:

items = s.split()

奇怪的是,您的数据框包含四列,但数据仅存在三列。我假设要么有错误,要么第四列是空的。既然我们不需要它,反正谁在乎呢?

在剩下的代码中,我:

  1. 从数据列表创建一维 numpy 数组

  2. 根据需要将其重塑为三列和任意多行

  3. 从该数组创建数据框,使用前三个原始项目作为列名

  4. 将“DNA”替换为 NaN,然后​​再替换为 0

  5. 将LOCATION列转换为索引,提取AQI列,并将其转换为整数。

    pd.DataFrame(np.array(items[4:]).reshape(-1, 3), columns=items[:3])\
                                    .replace('DNA', np.nan).fillna(0)\
                                    .set_index('LOCATION')['AQI'].astype(int)
    

不需要正则表达式。

您可以使用 regex 来解析您的字符串:

import pandas as pd
import re

s = """LOCATION AQI CATEGORY RANGE Dhaka 172 UNHEALTHY Chittagong 125 CAUTION Gazipur 178 UNHEALTHY Narayanganj 174 UNHEALTHY Sylhetc 129 CAUTION Khulna DNA DNA Rajshahi 118 CAUTION Barisal 118 CAUTION Savar DNA DNA Muradpur 126 CAUTION Cumilla 157 DNA Sandip DNA WARNING"""

data = []
for rec in re.sub(r'\b[A-Z]+\b', '', s).strip().split('  '):
    rec = rec.rsplit(maxsplit=1)
    loc = rec[0].strip()
    aqi = int(rec[1]) if len(rec) > 1 else 0
    data.append({'LOCATION': loc, 'AQI': aqi})
df = pd.DataFrame(data)

输出:

LOCATION AQI
Dhaka 172
Chittagong 125
Gazipur 178
Narayanganj 174
Sylhetc 129
Khulna 0
Rajshahi 118
Barisal 118
Savar 0
Muradpur 126
Cumilla 157
Sandip 0