我有一些字符串,它们可能包含某个东西的缩写或全称,我想将它们全部替换为相同单词的变体。
例如:
"8 gigs"、"8 gigabytes"和"8 gbs"应该都改成"8 gigabytes"。
最好的做法是什么呢?每个字符串分别替换吗?
此外,我想对多个单词执行此操作(即兆字节、千兆字节),这些单词每个都需要不同的替换吗?还是有方法将它们全部放在一个替换里?
一个简单的re.sub
可以为您解决问题。
>>> import re
>>> s = 'gigabytes, foo gigs; foo gbs'
>>> re.sub('(gigabytes|gigs|gbs)','gigabytes',s)
'gigabytes, foo gigabytes; foo gigabytes'
>>> import re
>>> re.sub(r'(\d+) (gigs|gigabytes|gbs)', r'\1 gigabytes', str)
对于多个替换,技巧是使用可调用对象(在这种情况下是lambda函数)作为替换:
>>> gb='gigabytes'
>>> mb='megabytes'
>>> subs={'gigs': gb, 'gigabytes': gb, 'gbs': gb, 'mbs': mb, ...}
>>> str='there are 2048 mbs in 2 gigs'
>>> re.sub(r'(\d+) ({})'.format('|'.join(subs.keys())), \
lambda x: '{} {}'.format(x.group(1), subs[x.group(2)]), str)
'there are 2048 megabytes in 2 gigabytes'