用正则表达式切换字符

时间:2014-01-10 07:21:52

标签: python regex string python-3.x

说我有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相关,但这似乎很长。

gnibbler suggests this:

b

但我似乎没有在python 3中工作。

2 个答案:

答案 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'

为什么re.sub代码不起作用?

因为传递给替换函数的参数不是字符串,而是a match object;将匹配对象与字符串进行比较会产生False0);替换返回第一项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'