我有一个字符串列表,其中一些包含数字。
例如:
我想清除这些字符串中的所有数字,但保留特定的数字,例如32和64,因此清除将返回以下内容:
请注意,在第一个示例(def3464)中,数字64存在,但并不孤单,因此应将其删除。
有什么想法吗?
答案 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)
-第一个选择(和捕获组),或者
32
或64
。|
-或\d+
-第二种选择,是数字序列。)
-非捕获组的结尾。(?=\D|$)
-(共同的)结尾部分(在两种选择之后)-正
查找非数字字符或字符串结尾。第一个备选方案(和捕获组)匹配32
或64
而第二种选择(没有捕获组)匹配任何其他数字。
替换表达式为\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(...)
。