Advertisement
VTsilaLETImogila

Untitled

Nov 9th, 2019
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.33 KB | None | 0 0
  1. #Мой парсер основан на том что все в JSON это объект
  2.  
  3. import re
  4. from timeit import default_timer as timer
  5. start = timer()
  6.  
  7. number_regex_1="-?(?:0|\d+)(?:\.\d+)?" #это часть регулярки говорит что число может быть нулем целым или дробным
  8. number_regex_2="(?:[eE][+-]?\d+)" #Это часть отвечает за эекспоненциальную форму числа
  9. number_regex = re.compile(r"(-?(?:0|\d+)(?:\.\d+)?(?:[eE][+-]?\d+)?)", re.DOTALL)
  10. string_regex_1='[^\\"]' #не встречаются символы закрывающую строку
  11. string_regex_2='\\["\\/bfnrt]' #/ один из следющих символов
  12. string_regex_3="\\u[0-9a-fA-F]{4}" #это нкжно для 4hex \u
  13. string_regex_4="*?" #так называемое lazy выражение озночает как можно меньшне повторений
  14. string_regex = re.compile(r'("(?:[^\\"]|\\["\\/bfnrt]|\\u[0-9a-fA-F]{4})*?")', re.DOTALL)
  15.  
  16. #послденяя часстьь для того чтобы работала нижняя штука
  17. def parse_number(src):
  18.     match = number_regex.search(src)
  19.     if match is not None:
  20.         number= match.group()
  21.         return eval(number) #делаю стринг числом
  22.  
  23. def parse_string(src):
  24.     match = string_regex.search(src)
  25.     if match is not None:
  26.         string= match.group()
  27.         return eval(string) #для ковычек
  28.  
  29. def parse_word(word, value=None):
  30.     def result(src):
  31.         if src.startswith(word)==True:  #Возвращает флаг, указывающий на то, начинается ли строка с указанного префикса
  32.             return value
  33.     return result
  34.  
  35. def parse_all(src):
  36.     ahaha=parse_string(src)
  37.     if ahaha is not None:
  38.         return ahaha
  39.     ahaha=parse_number(src)
  40.     if ahaha is not None:
  41.         return ahaha
  42.     ahaha=parse_false(src)
  43.     if ahaha is not None:
  44.         return ahaha
  45.     ahaha=parse_true(src)
  46.     if ahaha is not None:
  47.         return ahaha
  48.     ahaha=parse_null(src)
  49.     if ahaha is not None:
  50.         return ahaha
  51.  
  52. parse_true = parse_word("true", True)
  53. parse_false = parse_word("false", False)
  54. parse_null = parse_word("null", None)
  55. parse_comma = ","
  56. parse_left_curly_bracket = "{"
  57. parse_right_curly_bracket = "}"
  58. parse_colon =":"
  59.  
  60.  
  61. def pase_object(src):
  62.     left_curly_bracket=[]
  63.     right_curly_bracket=[]
  64.     objects=[]
  65.     res=[]
  66.  
  67.     for i in range(0,len(src)):
  68.         if src[i]==parse_left_curly_bracket:
  69.             left_curly_bracket.append(i)
  70.         elif src[i]==parse_right_curly_bracket:
  71.             right_curly_bracket.append(i)
  72. #получаем массив с границами объектов от внешнего к внутреннему
  73.     for i in range(0,len(right_curly_bracket)):
  74.         if i==0:
  75.             objects.append(left_curly_bracket[i])
  76.             objects.append(right_curly_bracket[len(right_curly_bracket)-i-1])
  77.         else:
  78.             objects.append(left_curly_bracket[i])
  79.             objects.append(right_curly_bracket[i-1])
  80.     #objects=[0, 30,5,29, 8, 19, 11, 27, 23, 28]
  81.     objects_a=[]
  82.     objects_a.append(objects[0])
  83.     objects_a.append(objects[1])
  84.  
  85.     i=2
  86.     while i<(len(objects)-2):
  87.         if (objects[i]<objects[i+2]) and (objects[i+1]<objects[i+2]):
  88.             print('объекты однородны')
  89.         else:
  90.  
  91.             per=objects[i]
  92.             objects[i]=objects[i+2]#если они друг в друге то надо поменять границы
  93.             objects[i+2]=per
  94.         i=i+2
  95.     objects_b=[]#зависимые в главном
  96.     #не большая проблема после подгонки коффициентов они смещаются
  97.     for i in range(0,len(objects)):
  98.         for j in range(0,len(objects)):
  99.             if (i%2==0)and(j%2==0):
  100.                 if objects[i]<objects[j]:
  101.                     k1=objects[i]
  102.                     k2=objects[i+1]
  103.                     objects[i]=objects[j]
  104.                     objects[i+1]=objects[j+1]
  105.                     objects[j]=k1
  106.                     objects[j+1]=k2
  107.  
  108.     i=2
  109.     while i < (len(objects) - 2):
  110.         if (objects[i] < objects[i + 2]) and (objects[i + 1] < objects[i + 2]):
  111.             print('объекты однородны')
  112.         else:
  113.             objects_a.append(objects[i+2])
  114.             objects_a.append(objects[i + 1])
  115.         i = i + 2
  116.  
  117.     print(objects)
  118.     print(objects_a)
  119.  
  120.     objects_b=[item for item in objects if item not in objects_a]
  121.     a =[]
  122.     for i in range(2, int(len(objects_a))):
  123.         if i % 2 == 0:
  124.             a.append(src[objects_a[i]:objects_a[i + 1]])
  125.  
  126.     for j in range(0,int(len(objects_b)/2)):
  127.         if j%2==0:
  128.             work_str=src[objects_b[j]:objects_b[j+1]]
  129.     for i in range(0,len(a)):
  130.         work_str=work_str.replace(a[i],'')
  131.  
  132.     work_str=work_str.replace('}','')
  133.     work_str=work_str.replace('{','')
  134.     work_str=work_str.replace(',','')
  135.     l1=work_str.split(':')
  136.  
  137.     print(l1[:len(l1)-1])
  138.  
  139.     for i in range(0,int(len(objects_a))):
  140.         if i%2==0:
  141.  
  142.             work_str=src[objects_a[i]:objects_a[i+1]]
  143.             t=0
  144.             for j in range(0,len(work_str)):
  145.  
  146.                 if work_str[j] == '{':
  147.                     t=t+1
  148.             if t==1:
  149.                 work_str=work_str.replace(',','`')
  150.             l=work_str.split('`')
  151.             if i==0:
  152.                 if (work_str.find('{',1)==work_str.find(':')+1 and (objects[3]==objects[1]-1)):
  153.  
  154.                     res.append('d')
  155.                     res.append(parse_all(l[0]))
  156.  
  157.                 else:
  158.                     #разработка
  159.                     print("2:17-я считаю это экономически не выгодно")
  160.             else:
  161.                 work_str = work_str.replace('}', '')
  162.                 work_str = work_str.replace('{', '')
  163.                 work_str = work_str.replace(',', '')
  164.  
  165.             print(l)
  166.  
  167. def key_value(key,values):
  168.     result={key : values}
  169.     return result
  170.  
  171.  
  172. f = open('lol.json', 'r', encoding = "utf-8")
  173. string=""
  174. lines=f.readlines()
  175. lines = [line.strip() for line in lines]
  176. for line in lines:
  177.     string1="".join(line)
  178.     string=string+string1
  179. pase_object('{1:{9:{e:{d:d,s:s}}}}')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement