说我有s='abaabbab'
之类的东西。是否可以使用正则表达式将其更改为s='babbaaba'
?我主要想知道这是否可行,而不是在合理的情况下。
我想也许其中一个会起作用(先前已导入re
):
s='ab'
re.sub('a|b',lambda x:['b','a'][x=='a'],s)
#or maybe
re.sub(r'a|b',lambda x:['b','a'][x=='b'],s)
但他们只会产生'bb'
。
我知道我可以用a
替换所有c
,然后用b
替换所有a
,然后替换所有{{1}与} c
相关,但这似乎很长。
b
但我似乎没有在python 3中工作。
答案 0 :(得分:6)
说我有类似s ='abaabbab'的东西。是否可以使用正则表达式将其更改为s ='babbaaba'?我主要想知道这是否可行,而不是在合理的情况下。
是的 - 但是你应该使用正确的形式str.translate
,如falsetru指出的那样......
import re
s = 'abaabbab'
print re.sub('[ab]', lambda L: {'a': 'b', 'b': 'a'}[L.group()], s)
# babbaaba
这是如何工作的是通过查找字符(在[]
之间定义的字符)和匹配时,调用替换函数(此处由lambda定义),该函数使用字典查找合适的替换字符。
答案 1 :(得分:3)
在Python 3.x中,您应该传递一个将unicode序列映射到unicode字符的字典。 (str.translate
documentation)
>>> s = 'abaabbab'
>>> s.translate({ord('a'): 'b', ord('b'): 'a'})
'babbaaba'
因为传递给替换函数的参数不是字符串,而是a match object;将匹配对象与字符串进行比较会产生False
(0
);替换返回第一项b
。
使用group
method获取匹配的字符串。
>>> s = 'ab'
>>> re.sub('[ab]', lambda x: ['b','a'][x.group() != 'a'], s)
'ba'
>>> re.sub('[ab]', lambda x: ['a', 'b'][x.group() == 'a'], s)
'ba'
>>> re.sub('[ab]', lambda x: 'ab'[x.group() == 'a'], s)
'ba'