我有很长的清单
| 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 =第一个地址值,第二个地址值
答案 0 :(得分:0)
在我看来,这是使用正则表达式的好地方。这是一个完整的工作解决方案,并从您的示例中得出了一些其他限制。
推断的规则:
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)