मेरे पास है :

 s='"Tag":"Football","name":"Mickael A","Played":"10times","Tag":"Basket","name":"Bruce B","Played":"8times","Tag":"Football","name":"John R","Played":"6times",'

मैं फुटबॉल और बास्केट के आधार पर विभाजित करना चाहता हूं यानी:

['','"Mickael A","Played":"10times"',
'"Bruce B","Played":"8times",',
'"John R","Played":"6times",']

मैंने कोशिश की :

s.strip().split(r'"Tag":("Football"|"Basket"),"name":')

लेकिन यह काम नहीं कर रहा है।

2
FFL75 28 फरवरी 2019, 18:12

5 जवाब

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

आपको re लाइब्रेरी का उपयोग करने और फ़ुटबॉल और बास्केटबॉल को गैर कैप्चरिंग समूह बनाने की आवश्यकता है ताकि वे परिणाम में प्रकट न हों:

import re
re.split(r'"Tag":(?:"Football"|"Basket"),"name":', s)

परिणाम होगा:

['', '"Mickael A","Played":"10times",', '"Bruce B","Played":"8times",', '"John R","Played":"6times",']
2
painor 28 फरवरी 2019, 18:19

बेहतर दृष्टिकोण इस स्ट्रिंग को संरचित करेगा और मैं नाम खेल रहा हूं और खेल (जो दोहराया जाता है वह एक व्यक्ति से संबंधित होता है)। तानाशाही की इस सूची के बाद आप आसानी से डेटा में हेरफेर कर सकते हैं

s='"Tag":"Football","name":"Mickael A","Played":"10times","Tag":"Basket","name":"Bruce B","Played":"8times","Tag":"Football","name":"John R","Played":"6times",'


l=[]
def fun(s):
 return str('{')+s+str('}')
import ast


k = s.strip().split(',')

for i in range(0,len(k),3):
    dic={}
    if len(k[i].split(':'))==2:
        dic['Tag']=ast.literal_eval(fun(k[i]))['Tag']
        dic['name']=ast.literal_eval(fun(k[i+1]))['name']
        dic['Played']=ast.literal_eval(fun(k[i+2]))['Played']
        l.append(dic)
print(l)
'''
output

[{'Tag': 'Football', 'name': 'Mickael A', 'Played': '10times'}, {'Tag': 'Basket', 'name': 'Bruce B', 'Played': '8times'}, {'Tag': 'Football', 'name': 'John R', 'Played': '6times'}]

'''
0
sahasrara62 28 फरवरी 2019, 18:43

re लाइब्रेरी वही करती है जो आपको चाहिए।

import re

s='"Tag":"Football","name":"Mickael A","Played":"10times","Tag":"Basket","name":"Bruce B","Played":"8times","Tag":"Football","name":"John R","Played":"6times",'
re.split('Football|Basket', s)

यह लौटता है

>>> ['"Tag":"',
     '","name":"Mickael A","Played":"10times","Tag":"',
     '","name":"Bruce B","Played":"8times","Tag":"',
     '","name":"John R","Played":"6times",'] 
0
Amir Imani 28 फरवरी 2019, 18:16

आप निम्न रेगेक्स का उपयोग re.split के साथ कर सकते हैं:

"Tag":"[^"]+","name":
  • "Tag":" अक्षरशः मेल खाता है

  • [^"]+ एक या अधिक वर्णों से मेल खाता है जो " नहीं हैं यानी अगले " तक मेल खाते हैं

  • ","name": अक्षरशः मेल खाता है

आप [^"]+ के बजाय गैर-लालची पैटर्न .*?" का भी उपयोग कर सकते हैं:

"Tag":".*?","name":'

उदाहरण:

In [486]: s = '"Tag":"Football","name":"Mickael A","Played":"10times","Tag":"Basket","name":"Bruce B","Played":"8times","Tag":"Football","name":"John R","Played":"6times",'

In [487]: re.split(r'"Tag":"[^"]+","name":', s)
Out[487]: 
['',
 '"Mickael A","Played":"10times",',
 '"Bruce B","Played":"8times",',
 '"John R","Played":"6times",']

In [488]: re.split(r'"Tag":".*?","name":', s)
Out[488]: 
['',
 '"Mickael A","Played":"10times",',
 '"Bruce B","Played":"8times",',
 '"John R","Played":"6times",']
1
heemayl 28 फरवरी 2019, 18:17

अपनी स्ट्रिंग का विश्लेषण करते हुए, ऐसा लगता है कि आपको इसकी आवश्यकता है:

re.findall(r'"name":(.*?),(?:"Tag"|$)', s)

जहां, s आपकी स्ट्रिंग है। यह किसी चीज़ (.*?) के बाद "name": और ,"Tag" या ,<end> से पहले की सभी घटनाओं का पता लगाता है

पूर्ण कोड:

import re

s = '"Tag":"Football","name":"Mickael A","Played":"10times","Tag":"Basket","name":"Bruce B","Played":"8times","Tag":"Football","name":"John R","Played":"6times",'

print(re.findall(r'"name":(.*?),(?:"Tag"|$)', s))
# ['"Mickael A","Played":"10times"', '"Bruce B","Played":"8times"', '"John R","Played":"6times"']
2
Austin 28 फरवरी 2019, 18:18