我试图从数据字符串中获取关键字后面的特定子字符串。这些集合的子字符串然后被连接在一起。
有没有比多次循环迭代更简单的方法,而不使用正则表达式?
我尝试拆分数据字符串(->单词列表),然后迭代它以临时保存出现关键字的索引(在单词列表中)。
使用这些索引,我可以看出关键字A的子字符串在关键字A的索引和关键字B之间,所以我从列表中加入了这些字符串。
这种方法似乎太复杂了。
data_string = "safpifucr keywordA: ejeca pfiktecr 3697406324 keywordB: 2505098781 epef ahemahkuj keywordC: ezivwut 2564556750 inanrune"
keywords = ['keywordA:', 'keywordB:', 'keywordC:']
split_string = data_string.split()
keyword_index = []
# Getting the indexes of keywords
for index, word in enumerate(split_string, start=0):
if word in keywords:
keyword_index.append((word, index))
def getSubString(split_string, key_index, next_key_index):
subString = []
for index, sub in enumerate(split_string, start=0):
if index > key_index and index < next_key_index:
subString.append(sub)
return subString
# Get SubString after Keyword A
subA = getSubString(split_string, keyword_index[0][1], keyword_index[1][1])
print(' '.join(subA)) # ejeca pfiktecr 3697406324
# Get SubString after Keyword A
subB = getSubString(split_string, keyword_index[1][1], keyword_index[2][1])
print(' '.join(subB)) # 2505098781 epef ahemahkuj
# Get SubString after Keyword A
subC = getSubString(split_string, keyword_index[2][1], len(split_string))
print(' '.join(subC)) # ezivwut 2564556750 inanrune我想知道是否有一种更简单的方法来实现上述结果,而不必多次迭代split_string。(n*关键字)
更新
我需要这样查看银行记录,所有交易信息在一个连续的字符串。各种相关信息都在关键字后面,后面跟着一个冒号。出于各种原因,我将不共享确切的字符串,但我重新构建了一些在结构上与虚构内容完全相同的示例。
# Approach 2 of blhsing with RANDOM-DATA
keywords = set(['Empfänger:', 'Verwendungszweck:', 'Zahlungsempfänger:', 'Auftraggeberinformation:', 'Zahlungsreferenz:'])
mapping = {}
keyword = None
data_list = (
'ONLINE BANKING VOM 1.10 UM 20:18 Empfänger: Henrietta Mullins Verwendungszweck: bestellung 57E639 2019-06-10 terriblesuccess.SG',
'SEPA Lastschrift Zahlungsempfänger: planetwötrap-AG Verwendungszweck: planetwötrap-AG-AG 460/487835-389 Ina Gill Auftraggeberinformation: 3740930917-909/387187-3',
'SEPA Lastschrift Zahlungsempfänger: AMAZON PAYMENTS EUROPE S.C.A. Verwendungszweck: 409-7235170-354760 AMZN Mktp FI 3882385979 Auftraggeberinformation: 6V0RRQCT6GAACLH8',
'POS 50,0648 FK K2 5.22 11:17 these cutting 5359')
for data_string in data_list:
for word in data_string.split():
if word in keywords:
keyword = word
print('if word in keywords: ', word)
elif keyword in mapping:
mapping[keyword] += ' ' + word
print('elif keyword in mapping: ', word)
elif keyword:
mapping[keyword] = word
print('elif keyword: ', word)
print(mapping)这输出
{'Empfänger:': 'Henrietta Mullins', 'Verwendungszweck:': 'bestellung 57E639 2019-06-10 terriblesuccess.SG SEPA Lastschrift planetwötrap-AG-AG 460/487835-389 Ina Gill 409-7235170-354760 AMZN Mktp FI 3882385979', 'Zahlungsempfänger:': 'planetwötrap-AG AMAZON PAYMENTS EUROPE S.C.A.', 'Auftraggeberinformation:': '3740930917-909/387187-3 SEPA Lastschrift 6V0RRQCT6GAACLH8 POS 50,0648 FK K2 5.22 11:17 these cutting 5359'}
发布于 2019-05-08 17:09:25
您可以将re.findall与通过加入关键字列表构建的交替模式一起使用,以构造将关键字映射到其值的dict:
import re
dict(re.findall(r'\b({0})\s+(.*?)\s*\b(?={0}|$)'.format('|'.join(map(re.escape, keywords))), data_string))这将返回:
{'keywordA:': 'ejeca pfiktecr 3697406324',
'keywordB:': '2505098781 epef ahemahkuj',
'keywordC:': 'ezivwut 2564556750 inanrune'}使用这个dict,输出每个给定关键字的值就变得非常简单。
发布于 2019-05-08 17:55:41
另一种只扫描字符串一次的方法是迭代数据字符串中的单词,如果找到关键字,保存关键字(首先将keywords转换为一组,以便进行更有效的查找),或者如果该单词不是关键字,则将该单词赋值并连接到当前关键字下的映射dict的dict值:
keywords = set(keywords)
mapping = {}
keyword = None
for word in data_string.split():
if word in keywords:
keyword = word
elif keyword in mapping:
mapping[keyword] += ' ' + word
elif keyword:
mapping[keyword] = wordmapping变成:
{'keywordA:': 'ejeca pfiktecr 3697406324',
'keywordB:': '2505098781 epef ahemahkuj',
'keywordC:': 'ezivwut 2564556750 inanrune'}https://stackoverflow.com/questions/56044833
复制相似问题