首页 > 解决方案 > 拆分列表中的字符串并匹配python中最后一个拆分的字符串

问题描述

我有一个很长的清单

| 0x60000000 | _loc_NO_BOOL_CONST_GROUP  
| 0x60000020 | _loc_NO_BOOL_GROUP  
| 0x60000020 | _loc_NO_BOOL_TEXT_GROUP    
| 0x6000ffe0 | _loc_NE_BOOL_GROUP  
| 0x6000ffe0 | _loc_NE_BOOL_TEXT_GROUP    
| 0x60010000 | _loc_NO_FIXED_DATA_GROUP   
| 0x60013dc0 | _loc_NE_BOOL_CONST_GROUP   
| 0x60013dc0 | _loc_NE_FIXED_DATA_GROUP 

我需要拆分_loc_NO_并且_loc_NE_必须匹配拆分的 LAST STRING ,如果找到匹配,则返回相应的值。

假设在_loc_NO_BOOL_CONST_GROUP我们拆分_loc_NO_和最后一个字符串中我们拆分和最后一个字符串是BOOL_CONST_GROUP 相似的_loc_NE_BOOL_CONST_GROUP_loc_NE_BOOL_CONST_GROUP

两个字符串都匹配,所以现在我必须返回相应的值,即“0x60000000”和“0x60013dc0”

所以输出应该是这样的:
BOOL_CONST_GROUP = 第一个地址值(即 0x60000000),第二个地址值(即 0x60013dc0)。

同样 BOOL_TEXT_GROUP = 第一个地址值,第二个地址值

标签: pythonpython-3.x

解决方案


在我看来,这是使用正则表达式的好地方。这是一个完整的工作解决方案,其中包含从您的示例中推断出的一些额外限制。

推断规则:

  • 您正在寻找有效的十六进制值,在这种情况下应该只是小写
  • 该指令是数据文件中每一行的最后一项
  • 您的数据在 datafile.txt 中
import re
from collections import defaultdict

strings_to_find = ['_loc_NO_', '_loc_NE_']

pat = re.compile(
      r'\| (?P<location>0x[0-9a-f]{8}) ' +
      r'\| (?P<instruction>%s)' % '|'.join(strings_to_find) +
      r'(?P<instruction_detail>.*?)$',
      re.MULTILINE | re.DOTALL)

with open('datafile.txt', 'r', encoding='utf-8') as infile:
    data = infile.read()

results = defaultdict(list)

matches = pat.finditer(data)
for m in matches:
    results[m.group('instruction_detail')].append(m.group('location'))

for k, v in results.items():
    print(k, v)

推荐阅读