我有一个数据框,其中有一列包含字符串(句子)。该字符串有许多驼峰式缩写。还有另一本词典包含这些缩写词及其各自的长形式的详细信息。
例如: 字典: {'ShFrm':'Shortform', 'LgFrm':'Longform' ,'Auto':'Automatik'} 数据框列具有如下文本:(为简单起见,每个列表条目是数据框中的一行) ['ShFrmLgFrm 应自动替换','Auto', 'AutoLgFrm']
如果我只是使用字典进行替换,则所有替换都是正确的,除了第一个文本中的“自动转换为“自动””之外。
我尝试在带有条件的字典的键值中使用正则表达式,仅当前面有空格/开头的 pf 字符串/小字母和后面有大写字母/空格/句子结尾时才替换单词:'( ?:^|[a-z])ShFrm(?:[^A-Z]|$)',但它也会替换中间字符串之前和之后的字符。
您能否帮我修改正则表达式模式,使其仅在前面有小写字母/前面有单词开头/空格并且后面有大写字母/后面有单词结尾/空格时才匹配缩写仅替换中间的单词,而不替换前后字符
最佳答案
您需要根据字典键构建基于交替的正则表达式,并使用 lambda 表达式作为替换参数。
查看以下Python demo :
import re
d = {'ShFrm':'Shortform', 'LgFrm':'Longform' ,'Auto':'Automatik'}
col = ['ShFrmLgFrm should be replaced Automatically','Auto', 'AutoLgFrm']
rx = r'(?:\b|(?<=[a-z]))(?:{})(?=[A-Z]|\b)'.format("|".join(d.keys()))
# => (?:\b|(?<=[a-z]))(?:ShFrm|LgFrm|Auto)(?=[A-Z]|\b)
print([re.sub(rx, lambda x: d[x.group()], v) for v in col])
# => ['ShortformLongform should be replaced Automatically', 'Automatik', 'AutomatikLongform']
在 Pandas 中,你可以像这样使用它:
df[col] = df[col].str.replace(rx, lambda x: d[x.group()], regex=True)
请参阅regex demo .
关于python - 基于条件的子字符串替换-python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70243250/