Python 3.7。x windows上。 我在使用字典中的string.replace()时遇到了问题,问题是字典值中有星号。 快速上下文:我们收集野外植物物种的数据,为了使事情更快,我们使用7个字符的“代码”和相应的完整的科学名称。如果是报告用的非本地物种,名字后面会有一个星号。例如:Cencili = Cenchrus ciliaris*或Eucpopu = Eucalyptus populnea 字段数据如下(在panda df中):
FieldData
Location Species
1 Site_1 Uromosa, Chlgaya, Cencili
2 Site_2 Cencili, Sclmuri, Eucpopu, Glaaris, Atahemi
词汇表/定义表是这样的(在转换成字典之前):
SpeciesList
Code Scientific
1 Cencili Cenchrus ciliaris*
2 Eucpopu Eucalyptus populnea
我尝试:
import pandas as pd
import csv, re
FieldData = pd.read_csv('FieldDataPath')
SpeciesList = pd.read_csv('SpeciesListPath')
SpeciesDict = dict(zip(SpeciesList.Code, SpeciesList.Scientific))
for k, v in SpeciesDict.items():
FieldData['Species'].replace(k, v, inplace = True, regex = True)
问题是这行得通……排序的。如果regex = True是成功替换的物种代码,但是在科学名称的每个字母之间插入星号。 洛杉矶:
Location Species
870 Site_1 *C*e*n*c*h*r*u*s* *c*i*l*i*a*r*i*s***,* *S*a*l...
如果regex = False,则replace()不起作用,数据保持不变。 如果我从词汇表中删除星号,它可以正常工作,但我需要星号在那里。在这个过程之后,我曾想过要单独标记非本地物种,但我想我也会遇到同样的问题。 我知道这与正则表达式有关,也知道星号是如何解释的,但我就是想不出来。我到处找,都没找到类似的问题。 长期潜伏者,初次发问者。我希望这个问题符合标准。 问题来源StackOverflow 地址:/questions/59385653/asterisk-issue-in-replace-when-using-a-dictionary-python
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Python中,正则表达式中的星号(*
)是一个特殊字符,表示前面的字符可以重复0次或多次。当你使用replace()
函数并设置regex=True
时,它会将字典中的键作为正则表达式模式处理,因此星号被错误地解释了。
为了解决这个问题,你需要在构建正则表达式时对星号进行转义,使其作为普通字符处理。这可以通过在星号前加上反斜杠(\
)来实现。但是,由于你在字符串中操作,需要对反斜杠再次转义,即使用两个反斜杠(\\
)。下面是如何修改你的代码以正确处理含有星号的替换:
import pandas as pd
# 读取数据
FieldData = pd.read_csv('FieldDataPath')
SpeciesList = pd.read_csv('SpeciesListPath')
# 创建字典,并对值中的星号进行转义
SpeciesDict = {k: v.replace('*', '\\*') for k, v in zip(SpeciesList['Code'], SpeciesList['Scientific'])}
# 替换过程,注意这里regex=True是必要的,因为我们手动处理了转义
for k, v in SpeciesDict.items():
FieldData['Species'] = FieldData['Species'].replace(k, v, regex=True)
这段代码首先创建了一个新的字典,其中科学名称中的每个星号都被替换成\\*
,这样在正则表达式中它们就会被当作字面字符处理,而不是重复运算符。然后,使用这个新字典进行替换,应该能够得到预期的结果,即不改变非星号字符之间的结构。