/ / पुनः स्ट्रिंग से पहचान करने के लिए - अजगर, रेगेक्स, सूची, पार्सिंग

स्ट्रिंग - पायथन, रेगेक्स, सूची, पार्सिंग से रेंज की पहचान करने के लिए फिर से

स्ट्रिंग से सूची प्राप्त करने के लिए लिखने और नियमित अभिव्यक्ति कैसे करें जैसे कि हमारे पास स्ट्रिंग है:

value = "88-94"
value = "88 to 94"
value = "88"
value = "88-94, 96-108"

परिणाम होना चाहिए:

[88, 89, 90, 91, 92, 93, 94]
[88, 89, 90, 91, 92, 93, 94]
[88]
[88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108]

प्रोग्रामिंग भाषा python2.7 है

यहाँ python2.7 और regex के लिए एक कार्यशील समाधान है, लेकिन अलग-अलग मामले के रूप में एकल मान वाले अंतिम मामले की जांच करनी है:

>>> import regex
>>> m = regex.match(r"(?:(?P<digits>d+).(?P<digits>d+))", "88-94")
>>> a = m.captures("digits")
>>> a
["88", "94"]
>>> m = regex.match(r"(?:(?P<digits>d+).(?P<digits>d+))", "88 94")
>>> a = m.captures("digits")
>>> a
["88", "94"]
>>> range(int(a[0]), int(a[1])+1)
[88, 89, 90, 91, 92, 93, 94]
>>>

यहां एक समाधान है जो मामलों के ऊपर पता करता है लेकिन 88-94, 96-98 आदि के बारे में क्या

>>> import re
>>> a = map(int, re.findall(r"d+", "88-94"))
>>> range(a[0], a[-1]+1)
[88, 89, 90, 91, 92, 93, 94]
>>> a = map(int, re.findall(r"d+", "88 94"))
>>> range(a[0], a[-1]+1)
[88, 89, 90, 91, 92, 93, 94]
>>> a = map(int, re.findall(r"d+", "88"))
>>> range(a[0], a[-1]+1)
[88]
>>>

समाधान जो लगभग सभी मामलों को कवर करता है:

>>> import re
>>> a = map(int, re.findall(r"d+", "88-94, 96-108"))
>>> c = zip(a[::2], a[1::2])
>>> [m for k in [range(i,j+1) for i, j in c] for m in k]
[88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108]
>>> a = map(int, re.findall(r"d+", "88-94, 96-108, 125 129"))
>>> c = zip(a[::2], a[1::2])
>>> [m for k in [range(i,j+1) for i, j in c] for m in k]
[88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 125, 126, 127, 128, 129]
>>> a = map(int, re.findall(r"d+", "88-94, 96-108, 125 129, 132 to 136"))
>>> c = zip(a[::2], a[1::2])
>>> [m for k in [range(i,j+1) for i, j in c] for m in k]
[88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 125, 126, 127, 128, 129, 132, 133, 134, 135, 136]
>>>

किसी को भी नीचा दिखाने का कारण बता सकते हैं या करीबी को वोट दे सकते हैं?

किसी भी मदद की सराहना की जाएगी और किसी को भी कर सकते हैंसुझाव दें कि कैसे अद्यतन करें सवाल मैं वैकल्पिक समाधान के लिए नहीं पूछ रहा हूं क्योंकि मुझे पता है कि विभाजन और लूप को भी कैसे हटाएं और अंक और लूप को फिर से विभाजित करें, मेरा सवाल यह है कि यदि संभव हो तो एकल विवरण में इसे कैसे करें? उत्तर ऑफ-टॉपिक के रूप में नहीं, बल्कि उत्तर हो सकता है।

उत्तर:

उत्तर № 1 के लिए 1
import re

def get_numbers(value):
value = re.sub(r"^(d+)$", r"1-1", value) # "88" -> "88-88"
start, stop = map(int, re.findall(r"d+", value))
return range(start, stop+1)

print get_numbers("88-94")
print get_numbers("88 to 94")
print get_numbers("88")

उत्पादन:

[88, 89, 90, 91, 92, 93, 94]
[88, 89, 90, 91, 92, 93, 94]
[88]

उत्तर № 2 के लिए 1
range(*map(int,mystring.split("-")))

रेगेक्स की कोई आवश्यकता नहीं है