【问题标题】:Switch chars with regex使用正则表达式切换字符
【发布时间】:2014-01-10 07:21:52
【问题描述】:

假设我有类似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'


我知道我可以用c 替换所有a,然后用a 替换所有b,然后用b 替换所有c ,但这似乎很长。

gnibbler suggests this:

from string import maketrans
trans_table = maketrans(".-a","-.A")
"foo-bar.".translate(trans_table)

但我似乎无法在 python 3 中工作。

【问题讨论】:

  • 正则表达式对于定义模式和查找与这些模式匹配的内容非常有用。像这样的字符替换任务似乎不适合正则表达式。
  • @user2357112 我主要是好奇是否有可能
  • 你只是在做简单的字符替换。正则表达式不会更短,会不太不稳定并且会更慢。在这里使用翻译没有任何问题。
  • @JonClements 好的;但是,translate 在 python 3 中似乎不起作用...(我复制了该代码,但出现错误)
  • @Quincunx 那么你的问题实际上是“我已经尝试过了 - 它在 Python 3 上不起作用” - 或者是,我真的,真的想要一个正则表达式... ?如果前者 - 你有你的答案:)

标签: python regex string python-3.x


【解决方案1】:

假设我有类似 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 定义),该函数使用字典查找合适的替换字符。

【讨论】:

  • 我已经了解正则表达式,现在我喜欢 python 处理正则表达式的方式,并且比 Java 使用更多。我的意思是,你甚至可以定义一个函数来为你处理替换。
  • @Jon:我认为在你的答案中引用(部分)问题是一个非常糟糕的主意。该网站最重要的目标之一是最大限度地提高信噪比,引用的摘录几乎是纯噪音。
  • @AlanMoore 在 1600 多个答案中,我认为我什至没有达到引用 OP 部分的两位数。但是,我觉得在这种情况下很重要,因为我想明确指出 OP 请求了一个正则表达式(即使他们现在知道他们并不真正需要一个)。这将减少来自 cmets 的潜在噪音,他们说这不是最好的方法 - 他们不需要这样做等等...... - 特别是如果 OP 在某个时候被编辑。
【解决方案2】:

在 Python 3.x 中,您应该传递将 unicode 序数映射到 unicode 字符的字典。 (str.translate documentation)

>>> s = 'abaabbab'
>>> s.translate({ord('a'): 'b', ord('b'): 'a'})
'babbaaba'

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

因为传递给替换函数的参数不是字符串,而是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'

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多