用python中的变量值替换特定格式的字符

2024-10-03 09:19:43 发布

您现在位置: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()有可能吗


Tags: 字符串name文件名格式replaceiibh产量
3条回答

您可以在re.sublambda替换中使用iternext

import re
name = iter(['T','D','FG'])
s = """
  II.NIL.10.BHZ.M.2058.190.160877
  II.NIL.10.BHA.M.2008.190.168857   
  II.NIL.10.BHB.M.2078.198.160857
  """
result = re.sub('(?<=BH)\w\.\w', lambda x:f'{next(name)}', s)

输出:

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

不,不能将str.replace与通配符一起使用。您必须将regex与以下内容一起使用

import re

filenames = ['II.NIL.10.BHA.M.2008.190.168857 ', 'II.NIL.10.BHB.M.2078.198.160857', 
'II.NIL.10.BHC.M.2078.198.160857']
name = ['T','D','FG']

newfilenames = []

for i in range(len(filenames)):
    newfilenames.append(re.sub(r'BH.?\.M', 'BH'+name[i], filenames[i]))

print(' '.join(newfilenames)) # outputs II.NIL.10.BHT.2008.190.168857  II.NIL.10.BHD.2078.198.160857 II.NIL.10.BHFG.2078.198.160857

您可以使用内置的regex模块(re)和以下模式一起有效地替换字符串中的内容

模式

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

此模式向后查找(不匹配)以确保检查子字符串'BH',然后在任何大写字符[A-Z]上匹配一次或多次+,然后再匹配子字符串'.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

处理多个文件

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

下面的示例使用原始问题中的数据以及上述逻辑,通过原始文件名和使用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

相关问题 更多 >