2 सवाल: कीवर्ड और इंडेक्स का उपयोग करके उप-स्ट्रिंग्स को निकालना कैसे संभव है?

पर बनाया गया सवाल Wed, May 8, 2019 12:00 AM

मैं डेटा स्ट्रिंग से किसी कीवर्ड के बाद कुछ उप-स्ट्रिंग प्राप्त करने की कोशिश कर रहा हूं। ये कोलेटेड उप-तार फिर एक साथ जुड़ जाते हैं।

नियमित अभिव्यक्तियों का उपयोग किए बिना, कई फॉर-लूप्स-पुनरावृत्तियों की तुलना में सरल दृष्टिकोण है?

मैंने डेटा स्ट्रिंग (- > शब्दों की सूची) को विभाजित करने की कोशिश की है और फिर अस्थायी रूप से सूचकांक (शब्दों की सूची में) को बचाने के लिए उस पर पुनरावृति करता है जहां एक कीवर्ड दिखाई दिया था।

इन इंडेक्स का उपयोग करते हुए, मैं बता सकता हूं कि कीवर्ड 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

मुझे आश्चर्य हो रहा था कि यदि कई बार विभाजित_स्ट्रीमिंग पर पुनरावृति किए बिना उपरोक्त परिणाम प्राप्त करने का एक सरल तरीका था। (एन * कीवर्ड्स)

अपडेट

मुझे बैंकिंग रिकॉर्ड के माध्यम से यह देखने की आवश्यकता है, जिसमें एक महाद्वीप में सभी लेनदेन जानकारी हैं। विभिन्न प्रासंगिक informations एक कोलन के बाद के सभी कीवर्ड हैं। विभिन्न कारणों से मैं सटीक स्ट्रिंग साझा नहीं करूंगा, लेकिन मैंने कुछ नमूनों को फिर से बनाया है जो संरचना में सिर्फ काल्पनिक सामग्री के साथ समान हैं।

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

    
1
  1. नियमित अभिव्यक्ति का उपयोग करने में क्या गलत है? यह दी गई समस्या के लिए सबसे अच्छा तरीका है।
    2019-05-08 16: 41: 33Z
  2. आप नियमित अभिव्यक्तियों के साथ कीवर्ड सूची का उपयोग कैसे करेंगे?
    2019-05-08 16: 50: 28Z
    2 उत्तर                              2                         

    आप कीवर्ड को उनके मानों के लिए एक तानाशाही का निर्माण करने के लिए कीवर्ड सूची में शामिल होने से निर्मित वैकल्पिक पैटर्न के साथ 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'}
    

    इस तानाशाही के साथ फिर यह प्रत्येक दिए गए कीवर्ड के मूल्य को आउटपुट करने के लिए तुच्छ हो जाता है।

        
    1
    2019-05-08 18: 11: 39Z
    1. हाँ, यह 'सिर्फ एक पंक्ति लेता है' के संदर्भ में अधिक सरल है। मैं व्यक्तिगत रूप से आरई में अपनी अनुभवहीनता के कारण इसे पसंद नहीं करता हूं और इसलिए भी कि यह बहुत ही अपठनीय है। फिर भी, यह एक व्यवहार्य दृष्टिकोण है जिस पर मुझे विचार करना चाहिए, मैं इसे बाद में देखूंगा।
      2019-05-08 17: 37: 24Z
    2. यह और भी कुशल है क्योंकि यह केवल एक बार स्ट्रिंग को स्कैन करता है। इसके अलावा, यह केवल अपठनीय है यदि आप आरई को नहीं जानते हैं, जो मैं अत्यधिक अनुशंसा करता हूं कि आप इससे परिचित हों।
      2019-05-08 17: 38: 47Z
    3. यह देखने के बाद कि कार्यान्वयन कितना छोटा हो गया है मैं केवल सहमत हो सकता हूं।
      2019-05-08 17: 45: 34Z
    4. मैं भाग re.escape को नहीं समझता, क्योंकि re.escape एक फ़ंक्शन है और यह यहां पैराएंटेस और पैरामीटर गायब है। तो, क्या आप मेरे लिए विस्तृत कर सकते हैं?
      2019-05-09 09: 04: 27Z
    5. Nevermind! यह मानचित्र फ़ंक्शन के अंदर है! ठीक है, मुझे लगता है कि मैं इसे अभी प्राप्त करता हूं।
      2019-05-09 09: 11: 00Z

      एक और तरीका जो स्ट्रिंग को भी स्कैन करता है वह केवल डेटा स्ट्रिंग में शब्दों के माध्यम से पुनरावृति करना है, यदि कोई कीवर्ड पाया जाता है तो कीवर्ड को सहेजें (0600350991100101035062 को पहले अधिक कुशल लुकअप के लिए सेट पर बदलें), या यदि शब्द नहीं है एक कीवर्ड, वर्तमान कीवर्ड के तहत मैपिंग के एक बड़े मान के लिए शब्द को असाइन और असाइन करें:

      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
      
      बन जाता है: mapping     
      2
      2019-05-08 19: 14: 16Z
      1. मैं उस दृष्टिकोण को पसंद करता हूं।
        2019-05-08 18: 03: 04Z
      2. यह पता चलता है कि यह विशिष्ट दृष्टिकोण मेरे विशिष्ट डेटा_स्ट्रिंग्स के लिए काम नहीं करता है। हालाँकि आपकी नियमित अभिव्यक्ति उदाहरण है। इसका मतलब है कि मैं इसे देखने के लिए मजबूर था और वास्तव में, यह थोड़ा अधिक पठनीय बनने लगता है।
        2019-05-09 09: 03: 22Z
      3. मैं देख रहा हूं। क्या आप अपने प्रश्न को वास्तविक
        {'keywordA:': 'ejeca pfiktecr 3697406324',
         'keywordB:': '2505098781 epef ahemahkuj',
         'keywordC:': 'ezivwut 2564556750 inanrune'}
        
        के नमूने के साथ अपडेट कर सकते हैं जो इस समाधान के साथ काम नहीं करता है? आपके वास्तविक data_strings के बारे में विवरणों की पहचान हो जाने के बाद यह काफी आसानी से ठीक हो सकता है।
        2019-05-09 17: 08: 02Z
      4. मैंने प्रश्न को अद्यतन किया, लेकिन मुझे यह उल्लेख करना चाहिए कि मैंने निश्चित रूप से आपके नियमित अभिव्यक्ति उत्तर पर स्विच कर दिया है क्योंकि यह इसे और अधिक समझने योग्य बनाता है (यदि आरई को जाना जाता है, फिर भी काम करना उस ^ ^ पर) और कुशल। इस उत्तर के साथ समस्या यह है कि यह मैपिंग में जोड़ना बंद नहीं करता है, भले ही यह सूची में अगला आइटम हो। (जो समस्याग्रस्त है क्योंकि उन्हें बिल्कुल नहीं मिलाना चाहिए)
        2019-05-10 07: 02: 28Z
        data_strings
स्रोत रखा गया यहाँ