首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用关键字和索引提取子字符串?

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

Stack Overflow用户
提问于 2019-05-08 16:05:11
回答 2查看 507关注 0票数 1

我试图从数据字符串中获取关键字后面的特定子字符串。这些集合的子字符串然后被连接在一起。

有没有比多次循环迭代更简单的方法,而不使用正则表达式?

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

使用这些索引,我可以看出关键字A的子字符串在关键字A的索引和关键字B之间,所以我从列表中加入了这些字符串。

这种方法似乎太复杂了。

代码语言:javascript
复制
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*关键字)

更新

我需要这样查看银行记录,所有交易信息在一个连续的字符串。各种相关信息都在关键字后面,后面跟着一个冒号。出于各种原因,我将不共享确切的字符串,但我重新构建了一些在结构上与虚构内容完全相同的示例。

代码语言:javascript
复制
# 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'}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-08 17:09:25

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

代码语言:javascript
复制
import re
dict(re.findall(r'\b({0})\s+(.*?)\s*\b(?={0}|$)'.format('|'.join(map(re.escape, keywords))), data_string))

这将返回:

代码语言:javascript
复制
{'keywordA:': 'ejeca pfiktecr 3697406324',
 'keywordB:': '2505098781 epef ahemahkuj',
 'keywordC:': 'ezivwut 2564556750 inanrune'}

使用这个dict,输出每个给定关键字的值就变得非常简单。

票数 1
EN

Stack Overflow用户

发布于 2019-05-08 17:55:41

另一种只扫描字符串一次的方法是迭代数据字符串中的单词,如果找到关键字,保存关键字(首先将keywords转换为一组,以便进行更有效的查找),或者如果该单词不是关键字,则将该单词赋值并连接到当前关键字下的映射dict的dict值:

代码语言:javascript
复制
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变成:

代码语言:javascript
复制
{'keywordA:': 'ejeca pfiktecr 3697406324',
 'keywordB:': '2505098781 epef ahemahkuj',
 'keywordC:': 'ezivwut 2564556750 inanrune'}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56044833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档