如何找到输入列表的匹配模式,然后使用python将找到的模式替换为正确的模式转换

2024-09-30 22:16:31 发布

您现在位置:Python中文网/ 问答频道 /正文

请注意,此模式的最后两个数字(例如FBXASC048)是数字的ascii码(0-9)

输入示例列表['FBXASC048009Car','FBXASC053002Toy','FBXASC050004Human'] 结果示例['1009Car','5002Toy','2004Human']

在输入列表中搜索这些模式的正确方法是什么

num_ascii = ['FBXASC048', 'FBXASC049', 'FBXASC050', 'FBXASC051', 'FBXASC052', 'FBXASC053', 'FBXASC054', 'FBXASC055', 'FBXASC056', 'FBXASC057']

然后将找到的模式替换为conv列表中的一项,但不是随机替换 因为模式列表中的每个元素只等于conv_列表中的一个元素

conv_list = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

这就是我们心中的解决方案: 它有两部分

第一部分-->;查找ascii模式[48、49、50、51、52、53、54、55、56、57] 然后用正确的十进制匹配(0-9)替换这些 因此,我们将得到一个新的输入列表,它将被称为input_modi_list,ascii替换为decimal 第二部分-->;另一个使用“FBXASC0”的替换函数使用固定模式进行替换的过程 新名单3

for x in input_modi_list:
    y = x.replace('FBXASC0', '')
    new_list3.append(new_string)  

因此,新的清单3将具有上述两部分的组合结果

我不知道是否会有一个简单的解决方案或更好的可能使用正则表达式 还要注意的是,我不知道如何将项目列表中的ascii替换为十进制


Tags: gt元素示例列表newinputascii模式
2条回答

我会这样做的

  1. 通过简单地将字符串与|连接,生成正则表达式模式:
>>> num_ascii = ['FBXASC048', 'FBXASC049', 'FBXASC050', 'FBXASC051', 'FBXASC052', 'FBXASC053', 'FBXASC054', 'FBXASC055', 'FBXASC056', 'FBXASC057']
>>> conv_list = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

>>> regex_pattern = '|'.join(num_ascii)
>>> regex_pattern
'FBXASC048|FBXASC049|FBXASC050|FBXASC051|FBXASC052|FBXASC053|FBXASC054|FBXASC055
|FBXASC056|FBXASC057'
  1. 只需压缩两个列表即可创建查找词典:
>>> conv_table = dict(zip(num_ascii, conv_list))
>>> conv_table
{'FBXASC048': '0', 'FBXASC049': '1', 'FBXASC050': '2', 'FBXASC051': '3', 'FBXASC
052': '4', 'FBXASC053': '5', 'FBXASC054': '6', 'FBXASC055': '7', 'FBXASC056': '8
', 'FBXASC057': '9'}
  1. 迭代数据并用相应的数字替换匹配的字符串:
>>> import re
>>> result = []
>>> for item in ['FBXASC048009Car', 'FBXASC053002Toy', 'FBXASC050004Human']:
...     m = re.match(regex_pattern, item)
...     matched_string = m[0]
...     digit = (conv_table[matched_string])
...     print(f'replacing {matched_string} with {digit}')
...     result.append(item.replace(matched_string, digit))
...
replacing FBXASC048 with 0
replacing FBXASC053 with 5
replacing FBXASC050 with 2
>>> result
['0009Car', '5002Toy', '2004Human']

我认为这应该起作用:

import re

input_list = ['FBXASC048009Car', 'FBXASC053002Toy', 'FBXASC050004Human']

pattern = re.compile('FBXASC(\d{3,3})')
def decode(match):
    return chr(int(match.group(1)))
result = [re.sub(pattern, decode, item) for item in input_list]

print(result)

现在,应该有一些解释:

1-对象pattern是一个regular expression,它将匹配以“FBXASC”开头并以3位数字(0-9)结尾的字符串的任何部分。(\d表示数字,{3,3}表示它应该至少出现3次,最多出现3次,即正好出现3次)。此外,围绕\d{3,3}的括号表示匹配的三位数字将被存储以供以后使用(在下一部分中解释)

2.decode函数接收一个match object,使用.group(1)提取第一个匹配的组(在我们的例子中是由\d{3,3}匹配的三位数字),然后使用int函数将字符串解析为整数(例如,将'048'转换为48),最后使用chr函数查找哪个字符具有该ASCII代码。(例如,chr(48)将返回“0”,chr(65)将返回“A”)

3-最后一部分将re.sub函数应用于列表的所有元素,这些元素将用相应的ASCII字符替换您描述的模式(FBXASC048[3位])的每次出现

您可以看到,此解决方案不仅限于您的特定示例。任何数字都可以使用,只要它具有由chr函数识别的相应ASCII字符

但是,如果您确实想将其限制在48-57范围内,只需修改decode函数即可:

def decode(match):
    ascii_code = int(match.group(1))
    if ascii_code >= 48 and ascii_code <= 57:
        return chr(ascii_code)
    else:
        return match.group(0) # returns the entire string - no modification

相关问题 更多 >