在列表中分割字符串并匹配python中最后分割的字符串

时间:2020-08-18 06:00:34

标签: python python-3.x

我有很长的清单

| 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 =第一个地址值,第二个地址值

1 个答案:

答案 0 :(得分:0)

在我看来,这是使用正则表达式的好地方。这是一个完整的工作解决方案,并从您的示例中得出了一些其他限制。

推断的规则:

  • 您正在寻找有效的十六进制值,在这种情况下,该值只能是小写
  • 指令是数据文件中每行的最后一项
  • 您的数据在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)