मैं re मॉड्यूल के re.compile() name1:A=a name2:B=b name3:C=c d में

name1 A=a, name2 B=b, name3 C=c d

यह अभी के लिए मेरा रेगेक्स है

(\w+): (A|B|C)(=[\w+\s*\w*]+)

लेकिन यह मुझे आउटपुट देता है:

name1: A=a name2: B=b name3: C=c d बोल्ड टेक्स्ट वह टेक्स्ट है जिसे वह कैप्चर कर रहा है। शब्द ए, बी और सी शीर्षकों की एक पूर्वनिर्धारित सूची से हैं यानी ये केवल '=' चिह्न से पहले आएंगे। चूंकि यह मेरा पहला प्रश्न है, कृपया मुझे बताएं कि क्या अधिक जानकारी की आवश्यकता है। मुझे आशा है कि मैं स्पष्ट हूँ।
अग्रिम धन्यवाद :D

3
Abhibha Gupta 24 सितंबर 2020, 14:09

4 जवाब

सबसे बढ़िया उत्तर

बंटवारे के बजाय आप संबंधित भागों से मिलान करने का प्रयास कर सकते हैं:

import re

text = "name1:A=a name2:B=b name3:C=c d"

rx = re.compile(r'\w+:(?:\w+(?:=\w+)?(?:\s+|$))+')

for match in rx.finditer(text):
    name, rest = match.group(0).split(":")
    print("{}, {}".format(name, rest))

यह प्रदान करता है

name1, A=a 
name2, B=b 
name3, C=c d

Regex101.com पर अभिव्यक्ति के लिए एक डेमो देखें।

2
Jan 24 सितंबर 2020, 15:08

आपको अगले मैच के लिए बढ़त का संकेत देना होगा। यहां लाइन फीड या टेक्स्ट के अंत ने काम किया।

(\w+): [ABC](=\w+\s*\w*)(?:\n|$)

वैसे, स्रोत में "," होता है जबकि आपके रेगेक्स में नाम के बाद ":" होता है।

यहां एक लाइन स्ट्रिंग के लिए एक समाधान है।

(\w+): (A|B|C)(=\w+\s*\w*?\(?:\s+|$))
1
NWiogrhkt 24 सितंबर 2020, 15:18

यदि आप विभाजन का उपयोग करने के लिए सीमित हैं, तो कृपया नीचे दिए गए रेगेक्स का उपयोग करें।

\s(?=\w+:)|:

उदाहरण

import re
text="name1:A=a name2:B=b name3:C=c d"
print(re.split(r"\s(?=\w+:)|:",text))

आउटपुट

['name1', 'A=a', 'name2', 'B=b', 'name3', 'C=c d']
1
Liju 24 सितंबर 2020, 15:17

यह आपके प्रश्न का बिल्कुल उत्तर नहीं देता है लेकिन यह जानना अच्छा है कि आप रेगेक्स का उपयोग किए बिना जो चाहते हैं उसे प्राप्त कर सकते हैं:

import itertools

my_string =  "name1 A:a name2 B:b name3 C:c  d"
# split on whitespaces
split_string = my_string.split()
# get only the even elements
evens = split_string[0::2]
# get only the odd elements
odds = split_string[1::2]
# get the A=a format you want
new_odds = [odd.replace(":", "=") for odd in odds]
# zip the lists together, without losing any elements from the longer list
zipped = itertools.zip_longest(evens, new_odds)
# make this zip a list for us to view it
zipped_as_list = [x for x in zipped]
# look at what we made
print(zipped_as_list)

मुझे नहीं पता कि अंत में आप अपने डेटा को किस आकार में चाहते हैं, या उस अनुगामी d का इलाज कैसे किया जाता है।

1
Peaceful James 24 सितंबर 2020, 14:43