我有一个字符串列表,其中一些包含数字。
例如:
- ABC123 def3464
- 你好32 再见64
- 一些数字1254324
我想清理这些字符串中的所有数字,但保留特定的数字,例如 32 和 64,因此清理将返回以下内容:
- 美国广播公司
- 你好32 再见64
- 一些数字
请注意,在第一个示例 (def3464) 中,数字 64 存在,但不是单独的,因此应该删除它。
有什么想法吗?
即使没有 lambda,您也可以完成任务,仅依靠 正则表达式功能(尽管正则表达式更复杂)。
所需的正则表达式是:(?:(32|64)|d+)(?=D|$)
.详:
(?:
- 非捕获组的开始,需要作为容器 对于替代方案。(32|64)
- 第一个备选方案(和捕获组),要么32
或64
.|
- 或。d+
- 第二种选择,数字序列。)
- 非捕获组的结束。- 共同)结束部分(在两个备选方案之后) - 正 查找非数字字符或字符串结尾。
(?=D|$)
- (第一个备选方案(和捕获组)匹配32
或64
第二个备选方案(不捕获组)与任何其他数字匹配。
替换表达式1
(将匹配项替换为 第一个捕获组)。
因此,如果第二个备选方案匹配,则第一组匹配什么都没有,因此没有任何东西作为当前比赛的替代品。
要演示其工作原理,请运行示例程序:
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()
。
您可以使用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 ']