如何替换除python中的特定数字以外的所有数字?

时间:2018-07-23 14:21:27

标签: python regex

我有一个字符串列表,其中一些包含数字。

例如:

  • abc123 def3464
  • hello32 goodbye64
  • 一些数字1254324

我想清除这些字符串中的所有数字,但保留特定的数字,例如32和64,因此清除将返回以下内容:

  • abc def
  • hello32 goodbye64
  • 一些数字

请注意,在第一个示例(def3464)中,数字64存在,但并不孤单,因此应将其删除。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

您可以使用re.sub

import re
s = ['abc123 def3464', 'hello32 goodbye64', 'some numbers 1254324']
new_s = [re.sub('\d+', lambda x:['', x.group()][x.group() in ['32', '64']], i) for i in s]

输出:

['abc def', 'hello32 goodbye64', 'some numbers ']

答案 1 :(得分:3)

即使没有lambda,您也可以完全依靠 regex功能(尽管regex更复杂)。

所需的正则表达式为:(?:(32|64)|\d+)(?=\D|$)。详细信息:

  • (?:-非捕获组的开始,需要作为容器 替代方案。
  • (32|64)-第一个选择(和捕获组),或者 3264
  • |-或
  • \d+-第二种选择,是数字序列。
  • )-非捕获组的结尾。
  • (?=\D|$)-(共同的)结尾部分(在两种选择之后)-正 查找非数字字符或字符串结尾。

第一个备选方案(和捕获组)匹配3264 而第二种选择(没有捕获组)匹配任何其他数字。

替换表达式为\1(将匹配项替换为 第一个捕获组)。

因此,如果 second 替代匹配,则第一组匹配 没什么,因此没有任何内容可替代当前比赛。

要演示其工作原理,请运行示例程序:

import re
src = ['abc123 def3464', 'hello32 goodbye64', 'some numbers 1254324']
print(src)
result = [re.sub(r"(?:(32|64)|\d+)(?=\D|$)", r"\1", i) for i in src]
print(result)

如果您对最后一个输出字符串中的结尾空格不满意, 在.strip()之后添加re.sub(...)