用于替换字符串中第二次出现的单词的 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()
奇怪的是,您的数据框包含四列,但数据仅存在三列。我假设要么有错误,要么第四列是空的。既然我们不需要它,反正谁在乎呢?
在剩下的代码中,我:
从数据列表创建一维 numpy 数组
根据需要将其重塑为三列和任意多行
从该数组创建数据框,使用前三个原始项目作为列名
将“DNA”替换为 NaN,然后再替换为 0
将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
字符串如下,
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()
奇怪的是,您的数据框包含四列,但数据仅存在三列。我假设要么有错误,要么第四列是空的。既然我们不需要它,反正谁在乎呢?
在剩下的代码中,我:
从数据列表创建一维 numpy 数组
根据需要将其重塑为三列和任意多行
从该数组创建数据框,使用前三个原始项目作为列名
将“DNA”替换为 NaN,然后再替换为 0
将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 |