如何在Python中替换括号之间的文本?

Gay*_*avi 0 python regex

我有一个包含以下键值对的字典: d={'Alice':'x','Bob':'y','Chloe':'z'}

我想用任何给定字符串中的常量(键)替换小写变量(值)。

例如,如果我的字符串是:

A(x)B(y)C(x,z)

如何替换字符以获得结果字符串:

A(爱丽丝)B(鲍勃)C(爱丽丝,克洛伊)

我应该使用正则表达式吗?

Rom*_*est 5

re.sub()具有替换功能的解决方案:

import re

d = {'Alice':'x','Bob':'y','Chloe':'z'}
flipped = dict(zip(d.values(), d.keys()))
s = 'A(x)B(y)C(x,z)'
result = re.sub(r'\([^()]+\)', lambda m: '({})'.format(','.join(flipped.get(k,'')
                                      for k in m.group().strip('()').split(','))), s)

print(result)
Run Code Online (Sandbox Code Playgroud)

输出:

A(Alice)B(Bob)C(Alice,Chloe)
Run Code Online (Sandbox Code Playgroud)

扩大的视野:

import re

def repl(m):
    val = m.group().strip('()')
    d = {'Alice':'x','Bob':'y','Chloe':'z'}
    flipped = dict(zip(d.values(), d.keys()))
    if ',' in val:
        return '({})'.format(','.join(flipped.get(k,'') for k in val.split(',')))
    else:
        return '({})'.format(flipped.get(val,''))


s = 'A(x)B(y)C(x,z)'
result = re.sub(r'\([^()]+\)', repl, s)

print(result)
Run Code Online (Sandbox Code Playgroud)

特定输入情况的奖励A(x)B(y)C(Alice,z)方法:

...
s = 'A(x)B(y)C(Alice,z)'
result = re.sub(r'\([^()]+\)', lambda m: '({})'.format(','.join(flipped.get(k,'') or k
                                      for k in m.group().strip('()').split(','))), s)

print(result)
Run Code Online (Sandbox Code Playgroud)