如何找到输入列表的匹配模式,然后使用 python 将找到的模式替换为正确的模式转换
how to find the matching pattern for an input list and then replace the found pattern with the proper pattern conversion using python
请注意,此模式的最后两个数字(例如 FBXASC048)是数字 (0-9) 的 ascii 代码
输入示例列表['FBXASC048009Car'、'FBXASC053002Toy'、'FBXASC050004Human']
结果示例 ['1009Car', '5002Toy', '2004Human']
在输入列表中搜索这些模式的正确方法是什么
num_ascii = ['FBXASC048', 'FBXASC049', 'FBXASC050', 'FBXASC051', 'FBXASC052', 'FBXASC053', 'FBXASC054', 'FBXASC055', 'FBXASC056', 'FBXASC057']
然后将找到的模式替换为转换列表中的一项,但不是随机的
因为模式列表中的每个元素只等于 conv_list
中的一个元素
conv_list = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
这是我想到的解决方案:
它有两部分
第 1 部分 --> 是查找 ascii 模式 [48, 49, 50, 51, 52, 53, 54, 55, 56,57]
然后用适当的小数匹配 (0-9) 替换那些
所以我们将得到新的输入列表 input_modi_list 将 ascii 替换为十进制
第 2 部分 --> 另一个使用固定模式替换的过程,使用替换函数就是这个 'FBXASC0'
new_list3
for x in input_modi_list:
y = x.replace('FBXASC0', '')
new_list3.append(new_string)
所以new_list3将得到上述两部分的组合结果。
我不知道是否会有一个简单的解决方案或更好的解决方案可能使用正则表达式
另请注意,我不知道如何用十进制替换项目列表的 ascii
我就是这样做的。
- 通过简单地用
|
: 连接字符串来制作正则表达式模式
>>> 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'
- 通过简单地压缩两个列表来创建 look-up 字典:
>>> 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'}
- 遍历数据并将匹配的字符串替换为相应的数字:
>>> 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-code。 (例如 chr(48) 将 return '0',而 chr(65) 将 return 'A')
3- 最后一部分将 re.sub
函数应用于列表的所有元素,它将用相应的 ASCII 字符替换您描述的模式 (FBXASC048[3-digits]) 的每个匹配项。
你可以看到这个解决方案不仅限于你的具体例子。只要具有被 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
请注意,此模式的最后两个数字(例如 FBXASC048)是数字 (0-9) 的 ascii 代码
输入示例列表['FBXASC048009Car'、'FBXASC053002Toy'、'FBXASC050004Human'] 结果示例 ['1009Car', '5002Toy', '2004Human']
在输入列表中搜索这些模式的正确方法是什么
num_ascii = ['FBXASC048', 'FBXASC049', 'FBXASC050', 'FBXASC051', 'FBXASC052', 'FBXASC053', 'FBXASC054', 'FBXASC055', 'FBXASC056', 'FBXASC057']
然后将找到的模式替换为转换列表中的一项,但不是随机的 因为模式列表中的每个元素只等于 conv_list
中的一个元素conv_list = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
这是我想到的解决方案: 它有两部分
第 1 部分 --> 是查找 ascii 模式 [48, 49, 50, 51, 52, 53, 54, 55, 56,57] 然后用适当的小数匹配 (0-9) 替换那些 所以我们将得到新的输入列表 input_modi_list 将 ascii 替换为十进制 第 2 部分 --> 另一个使用固定模式替换的过程,使用替换函数就是这个 'FBXASC0' new_list3
for x in input_modi_list:
y = x.replace('FBXASC0', '')
new_list3.append(new_string)
所以new_list3将得到上述两部分的组合结果。
我不知道是否会有一个简单的解决方案或更好的解决方案可能使用正则表达式 另请注意,我不知道如何用十进制替换项目列表的 ascii
我就是这样做的。
- 通过简单地用
|
: 连接字符串来制作正则表达式模式
>>> 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'
- 通过简单地压缩两个列表来创建 look-up 字典:
>>> 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'}
- 遍历数据并将匹配的字符串替换为相应的数字:
>>> 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-code。 (例如 chr(48) 将 return '0',而 chr(65) 将 return 'A')
3- 最后一部分将 re.sub
函数应用于列表的所有元素,它将用相应的 ASCII 字符替换您描述的模式 (FBXASC048[3-digits]) 的每个匹配项。
你可以看到这个解决方案不仅限于你的具体例子。只要具有被 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