मुझे वह जानकारी नहीं मिल रही है, जो मुझे अपने कार्यक्रम के लिए चाहिए और आशा है कि कोई मेरी मदद कर सकता है। मेरे पास प्रत्येक पंक्ति में संख्याएं और अक्षर हैं। निश्चित संख्याओं से पहले विशेष वर्ण होते हैं। प्रत्येक पंक्ति इस तरह दिखती है:

12456 t0 45 54 # 36478 t04 # 37489 to4 # 83940 to5 + 63748 nn 00 +374840 bb 009 + 144839 op 45

मुझे उनके सामने # और + वाली संख्याएँ निकालनी हैं।

और परिणाम इस तरह 3-टुपेल जैसा दिखना चाहिए:

(पहली संख्या, सूची के रूप में उनके सामने # के साथ सभी संख्याएं (अंतरिक्ष तक), सूची के रूप में उनके सामने + के साथ सभी संख्याएं (अंतरिक्ष तक भी, to4, to5 आदि के बिना)):

(12456, [36478, 37489, 83940], [63748, 375840, 144839])

क्या इस कार्य के लिए कोई नियमित अभिव्यक्ति है?

1
Jack.Bl 24 मई 2016, 18:19

3 जवाब

मान प्राप्त करने के लिए यहां रेगेक्स हैं, आपकी लाइन परिवर्तनीय स्ट्रिंग है

r1= re.compile("(\d+)")
r2 = re.compile("#\s*(\d+)")
r3 = re.compile("\+\s*(d+)")
(r3.search(string).group(0),r2.findall(string),r.findall(string))
0
Vikas Madhusudana 24 मई 2016, 18:54
आपका बहुत बहुत धन्यवाद! एक और सवाल: क्यों ("\+\s*(\d+)") काम करता है और ("*\s*(\d+)") + के बजाय * के साथ काम नहीं करता है? एचएम, ("#\s*(\d+)") भी काम नहीं करता... केवल r1 और r3...
 – 
Jack.Bl
24 मई 2016, 20:36
\+ का मतलब है + कैरेक्टर (\ एस्केप कैरेक्टर जैसा + रेगेक्स में एक स्पेशल कैरेक्टर है) जबकि * किसी भी कैरेक्टर से मेल खा सकता है
 – 
Vikas Madhusudana
24 मई 2016, 20:40
हाँ, लेकिन अगर मुझे + के बजाय * की आवश्यकता है (मुझे इस तरह की संख्याओं की आवश्यकता है * 637383 और \ मैं रेगेक्स में एक विशेष चरित्र के रूप में * से बचना चाहता हूं) लेकिन यह काम नहीं करता है: विशेषता त्रुटि: 'कोई नहीं टाइप' ऑब्जेक्ट नहीं है विशेषता 'समूह'। सब कुछ समान है, मैं बस + के बजाय * डालता हूं और यह काम नहीं करता है ....
 – 
Jack.Bl
24 मई 2016, 20:52
यह काम करना चाहिए >>> r=re.compile("*\s*(\d+)"); >>> r.findall ("* 6888 * 99999"); ['6888', '999999']
 – 
Vikas Madhusudana
24 मई 2016, 21:12
ऐसा लगता है कि आप ("\*\s*(\d+)") के बजाय ("*\s*(\d+)") निर्दिष्ट कर रहे हैं
 – 
Vikas Madhusudana
24 मई 2016, 21:23

मुझे नहीं लगता कि समूहीकरण की आवश्यकता के कारण नियमित अभिव्यक्ति नौकरी के लिए सही उपकरण होगी। मैं निम्नलिखित का सुझाव दूंगा:

in_str = "12456 t0 45 54 # 36478 t04 # 37489 to4 # 83940 to5 + 63748 nn 00 +374840 bb 009 + 144839 op 45"
parts = in_str.split()
first = None
got_hash = False
hashes = []
got_plus = False
pluses = []


for part in parts:
  if first is None:
    first = int(part)
  elif part == "#":
    got_hash = True
  elif part == "+":
    got_plus = True
  elif got_hash:
    hashes.append(int(part))
    got_hash = False
  elif got_plus:
    pluses.append(int(part))
    got_plus = False

print ((first, hashes, pluses))

ध्यान दें कि यह जगह नहीं होने के कारण 375840 प्रिंट नहीं करता है

0
Jasper 24 मई 2016, 18:54

मेरी सलाह है कि तीन सरल रेगेक्स का उपयोग करें और परिणामों को मर्ज करें क्योंकि एक अपरिभाषित राशि निकालने के लिए आपको एक ही लाइन पर कई मैचों के साथ एक वैश्विक रेगेक्स बनाना होगा, इसलिए:

पहले नंबर के लिए:

re.compile("\d+")

# नंबरों के लिए

re.compile("# *?\d+")

और + नंबरों के लिए

re.compile("+ *?\d+")
0
Giacomo Garabello 24 मई 2016, 19:06