用字典替换字符串,用标点符号进行复杂处理

2024-04-19 13:24:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图编写一个函数process(s,d),用字典将字符串中的缩写替换为它们的全部含义。其中s是字符串输入,d是字典。例如:

>>>d = {'ASAP':'as soon as possible'}
>>>s = "I will do this ASAP.  Regards, X"
>>>process(s,d)
>>>"I will do this as soon as possible.  Regards, X"

我尝试使用split函数来分隔字符串,并将每个部分与字典进行比较。在

^{pr2}$

但是,它返回的是相同的字符串。我怀疑代码不能正常工作是因为原始字符串中ASAP后面的句号。如果是这样的话,我怎么能忽略标点符号并尽快被替换?在


Tags: 函数字符串字典asthisprocessdowill
3条回答

你可以这样做:

def process(s,d):
    for key in d:
        s = s.replace(key,d[key])
    return s

以下是使用单个正则表达式执行此操作的方法:

In [24]: d = {'ASAP':'as soon as possible', 'AFAIK': 'as far as I know'}

In [25]: s = 'I will do this ASAP, AFAIK.  Regards, X'

In [26]: re.sub(r'\b' + '|'.join(d.keys()) + r'\b', lambda m: d[m.group(0)], s)
Out[26]: 'I will do this as soon as possible, as far as I know.  Regards, X'

与基于str.replace()的版本不同,它遵循单词边界,因此不会替换出现在其他单词中间的缩写(例如“fetch”中的“etc”)。在

而且,不像大多数人(全部?)到目前为止提出的其他解决方案是,它只在输入字符串上迭代一次,而不管字典中有多少个搜索词。在

这里有一个可行的解决方案:使用re.split(),并按单词边界分割(保留间隙字符):

''.join( d.get( word, word ) for word in re.split( '(\W+)', s ) )

这个代码与Vaughn或Sheena的答案有一个显著的区别,那就是这段代码利用了字典的O(1)查找时间,而他们的解决方案会查看字典中的每个键。这意味着当s很短,d非常大时,它们的代码将需要更长的时间来运行。此外,部分单词在它们的解中仍然会被替换:如果d = { "lol": "laugh out loud" }和{},它们的解将错误地产生{}。在

相关问题 更多 >