我有一个字符串列表,其中一些包含数字。
例如:
- abc123 def3464
- 你好32 再见64
- 一些数字 1254324
我想清理这些字符串中的所有数字,但保留特定数字,例如 32 和 64,因此清理将返回以下内容:
- abc def
- 你好32 再见64
- 一些数字
请注意,在第一个示例 (def3464) 中,数字 64 存在,但不是单独存在的,因此应将其删除。
有什么想法吗?
请您参考如下方法:
即使没有 lambda,您也可以完成任务,仅依靠 正则表达式功能(尽管正则表达式更复杂)。
所需的正则表达式是:(?:(32|64)|\d+)(?=\D|$)。详情:
(?:- 非捕获组的开始,需要作为容器 寻找替代品。(32|64)- 第一个替代方案(和捕获组),要么32或64。|- 或者。\d+- 第二种选择,数字序列。)- 非捕获组结束。(?=\D|$)-(共同)结尾部分(在两种选择之后)- 正 查找非数字字符或字符串结尾。
第一个替代项(和捕获组)匹配 32 或 64 第二种选择(没有捕获组)匹配任何其他数字。
替换表达式为\1(替换匹配的内容为 第一个捕获组)。
所以,如果second备选匹配,则第一组匹配 nothing,因此不会将任何内容替换为当前匹配项。
为了演示它是如何工作的,请运行示例程序:
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)
如果您对最后输出字符串中的尾随空格不满意, 在 re.sub(...) 之后添加 .strip()。
