嗨,我正在尝试用Pandas中的字典重新映射Dataframe,但是我需要使用regex来使事情正常工作。
下面是dict的一个示例:
di_cities = {
"Ain Salah (town)": "Ain Salah"
"Agadez town": "Agadez"
"Bamako city": "Bamako",
"Birnin Konni town": "Birni N Konni",
"Konni": "Birni N Konni",
"Kadunà": "Kaduna",
"Kaduna (city)": "Kaduna",
"Kano (city)": "Kano"
"Matamey": "Matamey",
"Mopti city": "Mopti"
"N'guigmi": "Nguigmi",
"Tunis": "Tunis",
"Tunis (city)": "Tunis"
}我正在使用这个迭代:
di_cities = {rf"\b{k}\b": v for k, v in di_cities.items()}
df_cities_clean = df.replace(di_cities, regex=True)正如你在图片中看到的(最后的结果),它对巴马科,阿加德兹,莫普提和每一个独立字串都很好。不适用于带括号的任何字符串,如果发生Birnin,Konni会搞砸一点。我正在以类似的方式使用另一种字典,但是每个字符串都在括号和{rf"\({k}\)"之间工作得很好。
你能帮帮我吗?
发布于 2021-11-15 08:04:51
我建议用
di_cities = {rf"\b{re.escape(k)}(?:(?<=\w)\b|(?<!\w))": v for k, v in di_cities.items()}通过本词典的理解,您可以创建另一个字典,将键作为正则表达式,将前键作为以单词字符(即数字、字母、下划线、连接器标点符号)开头的全部单词,如果它们以单词字符结尾,则不会立即使用另一个单词字符。如果键没有以单词char结尾,例如,如果它以标点符号或空格结尾(可能添加.strip()会使其更安全),则不需要进行额外的边界检查。
rf"\b{re.escape(k)}(?:(?<=\w)\b|(?<!\w))"首先在键中转义所有特殊的regex元字符,然后在其前面加上一个单词边界,而(?:(?<=\w)\b|(?<!\w))是一个匹配的非捕获组。
(?<=\w)\b -如果前面的字符是一个单词字符,则为一个单词边界((?<!...)是一个正向后看)| -或(?<!\w)) -如果当前位置的左侧没有单词char,则不进行额外检查(空字符串匹配) ((?<!...)是负查找)。https://stackoverflow.com/questions/69901386
复制相似问题