2 Làm thế nào có thể trích xuất các chuỗi con bằng cách sử dụng từ khóa và chỉ mục?

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi đang cố gắng để có được chuỗi phụ nhất định theo từ khóa từ chuỗi dữ liệu. Các chuỗi con được ghép lại này sau đó được nối với nhau.

Có cách tiếp cận đơn giản hơn nhiều lần lặp vòng lặp, mà không sử dụng biểu thức thông thường không?

Tôi đã cố tách chuỗi dữ liệu (- > danh sách các từ) và sau đó lặp lại chuỗi đó để tạm thời lưu chỉ mục (trong danh sách các từ) nơi xuất hiện từ khóa.

Sử dụng các chỉ mục này, tôi có thể nói rằng chuỗi con của từ khóa A nằm giữa chỉ mục của từ khóa A và từ khóa B. Vì vậy, tôi tham gia các chuỗi này từ danh sách.

Cách tiếp cận này có vẻ khá phức tạp.

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

Tôi đã tự hỏi liệu có cách nào đơn giản hơn để đạt được kết quả trên mà không phải lặp đi lặp lại trên split_ chuỗi nhiều lần. (n * từ khóa)

Cập nhật

Tôi yêu cầu điều này để xem qua các hồ sơ ngân hàng có tất cả Thông tin giao dịch trong một Chuỗi liên tục. Các thông tin liên quan khác nhau đều nằm sau các từ khóa theo sau là dấu hai chấm. Vì nhiều lý do, tôi sẽ không chia sẻ Chuỗi chính xác nhưng tôi đã xây dựng lại một số mẫu có cấu trúc giống hệt nhau chỉ với nội dung hư cấu.

# 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)

Kết quả này

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

    
1
  1. Có gì sai khi sử dụng biểu thức thông thường? Đó là cách tiếp cận tốt nhất cho vấn đề đã cho.
    2019-05-08 16: 41: 33Z
  2. Bạn sẽ sử dụng danh sách từ khóa với các biểu thức thông thường như thế nào?
    2019-05-08 16: 50: 28Z
2 Câu trả lời                              2                         

Bạn có thể sử dụng re.findall với mẫu thay thế được xây dựng từ việc tham gia danh sách từ khóa để xây dựng một lệnh đọc ánh xạ từ khóa đến giá trị của chúng:

import re
dict(re.findall(r'\b({0})\s+(.*?)\s*\b(?={0}|$)'.format('|'.join(map(re.escape, keywords))), data_string))

Điều này trả về:

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

Với lệnh này, nó trở nên tầm thường để xuất giá trị của từng từ khóa đã cho.

    
1
2019-05-08 18: 11: 39Z
  1. Vâng, đơn giản hơn về mặt 'chỉ mất một dòng'. Cá nhân tôi không thích nó vì sự thiếu kinh nghiệm của tôi trong RE và cũng bởi vì nó rất khó đọc. Tuy nhiên, đó là một cách tiếp cận khả thi mà tôi nên xem xét, tôi sẽ xem xét nó sau.
    2019-05-08 17: 37: 24Z
  2. Nó cũng hiệu quả hơn vì nó chỉ quét chuỗi một lần. Ngoài ra, nó chỉ không thể đọc được nếu bạn không biết RE, mà tôi thực sự khuyên bạn nên làm quen với.
    2019-05-08 17: 38: 47Z
  3. Sau khi thấy việc triển khai trở nên ngắn như thế nào, tôi chỉ có thể đồng ý.
    2019-05-08 17: 45: 34Z
  4. Tôi không hiểu phần re.escape, bởi vì re.escape là một chức năng và nó thiếu các thông số và thông số ở đây. Vì vậy, bạn có thể giải thích điều đó cho tôi không?
    2019-05-09 09: 04: 27Z
  5. Nevermind! Đó là bên trong chức năng bản đồ! Ok, tôi nghĩ rằng tôi nhận được nó ngay bây giờ.
    2019-05-09 09: 11: 00Z

Một cách tiếp cận khác cũng chỉ quét chuỗi một lần là lặp lại các từ trong chuỗi dữ liệu, lưu từ khóa nếu tìm thấy từ khóa (chuyển đổi 060035099111100135035062 thành một bộ đầu tiên để tra cứu hiệu quả hơn) hoặc nếu từ đó không một từ khóa, gán và nối từ với giá trị chính tả của một lệnh ánh xạ theo từ khóa hiện tại:

keywords

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
trở thành: mapping     
2
2019-05-08 19: 14: 16Z
  1. Tôi thích cách tiếp cận đó.
    2019-05-08 18: 03: 04Z
  2. Hóa ra phương pháp cụ thể này không hoạt động đối với data_strings cụ thể của tôi. Ví dụ biểu hiện thường xuyên của bạn không. Điều đó có nghĩa là tôi bị buộc phải nhìn vào nó và thực sự, nó bắt đầu trở nên dễ đọc hơn một chút.
    2019-05-09 09: 03: 22Z
  3. Tôi thấy. Bạn có thể cập nhật câu hỏi của mình với một mẫu
    {'keywordA:': 'ejeca pfiktecr 3697406324',
     'keywordB:': '2505098781 epef ahemahkuj',
     'keywordC:': 'ezivwut 2564556750 inanrune'}
    
    thực tế không hoạt động với giải pháp này không? Nó có thể dễ dàng sửa chữa một khi các chi tiết về data_strings thực tế của bạn được xác định.
    2019-05-09 17: 08: 02Z
  4. Tôi đã cập nhật câu hỏi, nhưng tôi nên đề cập rằng tôi chắc chắn đã chuyển sang câu trả lời biểu thức thông thường của bạn vì nó làm cho nó dễ hiểu hơn (nếu biết RE, vẫn hoạt động trên đó ^^) và hiệu quả. Vấn đề với câu trả lời này là nó không ngừng thêm vào ánh xạ ngay cả khi nó đã là mục tiếp theo trong danh sách. (đó là vấn đề vì họ hoàn toàn không nên lẫn lộn)
    2019-05-10 07: 02: 28Z
data_strings
nguồn đặt đây