如何使用关键字和索引提取子字符串?

时间:2019-05-08 16:05:11

标签: python string data-manipulation

我正在尝试从数据字符串中获取关键字后面的某些子字符串。 然后将这些缩口的子字符串连接在一起。

有没有比使用for循环迭代更简单的方法,而无需使用正则表达式?

我试图拆分数据字符串(->单词列表),然后对其进行迭代以临时保存出现关键字的索引(在单词列表中)。

使用这些索引,我可以判断出关键字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 *个关键字)

更新

我需要使用它来查看在一个连续字符串中包含所有交易信息的银行记录。各种相关信息都在关键字后面,后跟冒号。 由于各种原因,我不会共享确切的String,但是我重建了一些结构相同,只是虚构内容的示例。

# 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'}

2 个答案:

答案 0 :(得分:2)

另一种只扫描字符串一次的方法是遍历数据字符串中的单词,如果找到了关键字,则保存关键字(将keywords转换为集合以进行更有效的查找),或者该单词不是关键字,请将该单词分配并连接到当前关键字下映射字典的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] = word

mapping变为:

{'keywordA:': 'ejeca pfiktecr 3697406324',
 'keywordB:': '2505098781 epef ahemahkuj',
 'keywordC:': 'ezivwut 2564556750 inanrune'}

答案 1 :(得分:1)

您可以将re.findall与交替模式一起使用,该模式是通过加入关键字列表来构建的,用于将关键字映射到其值的字典:

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'}

有了这个命令,输出每个给定关键字的值就变得很简单。