首页 > 解决方案 > 用python中的变量值替换具有特定格式的字符

问题描述

我有给定特定格式的文件名

II.NIL.10.BHZ.M.2058.190.160877
II.NIL.10.BHA.M.2008.190.168857   
II.NIL.10.BHB.M.2078.198.160857
.
.
.

我想删除BH?.M带有字符串变量中值的部分name

name=['T','D','FG'.....]

预期产出

II.NIL.10.BHT.2058.190.160877
II.NIL.10.BHD.2008.190.168857   
II.NIL.10.BHFG.2078.198.160857
.
.
.

有可能str.replace()吗?

标签: pythonstringreplace

解决方案


您可以使用内置的正则表达式模块 ( re) 以及以下模式来有效地替换字符串中的内容。

图案

'(?<=BH)[A-Z]+\.M'

此模式向后查找(不匹配)以确保检查 substring 'BH',然后匹配任何大写字符[A-Z]一次或多次,+然后是 substring '.M'

解决方案

下面的解决方案re.sub()与上面概述的模式一起使用,以返回一个字符串,其中的子字符串与模式匹配的子字符串替换为此处定义为replacement.

import re

original = 'II.NIL.10.BHB.M.2078.198.160857'
replacement = 'FG'
output = re.sub(r'(?<=BH)[A-Z]+\.M', replacement, original)

print(output)

输出

II.NIL.10.BHFG.2078.198.160857

处理多个文件

要对多个文件重复此过程,您可以在循环/理解中应用上述逻辑,re.sub()在每个original/replacement配对上运行该函数并适当地存储/处理。

下面的示例使用原始问题中的数据以及上述逻辑,re.sub()通过原始文件名和要使用插入的子字符串之间的字典映射来创建一个包含每个操作结果的列表re.sub()

import re

originals = [
    'II.NIL.10.BHZ.M.2058.190.160877',
    'II.NIL.10.BHA.M.2008.190.168857',   
    'II.NIL.10.BHB.M.2078.198.160857'
]

replacements = ['T','D','FG']

mapping = {originals[i]: replacements[i] for i, _ in enumerate(originals)}

results = [re.sub(r'(?<=BH)[A-Z]+\.M', v, k) for k,v in mapping.items()]

for r in results:
    print(r)

输出

II.NIL.10.BHT.2058.190.160877
II.NIL.10.BHD.2008.190.168857
II.NIL.10.BHFG.2078.198.160857

推荐阅读