Advertisement
VTsilaLETImogila

Untitled

Nov 9th, 2019
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.42 KB | None | 0 0
  1. from itertools import chain
  2. import re
  3. from timeit import default_timer as timer
  4. start = timer()
  5.  
  6. number_regex_1="-?(?:0|\d+)(?:\.\d+)?" #это часть регулярки говорит что число может быть нулем целым или дробным
  7. number_regex_2="(?:[eE][+-]?\d+)" #Это часть отвечает за эекспоненциальную форму числа
  8. regex_for_all="\s(.*)" #\r\n\t\f\v - это делает \s* а .* означает любой символ
  9. number_regex = re.compile(r"(-?(?:0|\d+)(?:\.\d+)?(?:[eE][+-]?\d+)?)\s*(.*)", 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})*?")\s*(.*)', re.DOTALL)
  15.  
  16. #послденяя часстьь для того чтобы работала нижняя штука
  17. def parse_number(src):
  18.     match = number_regex.match(src)
  19.     if match is not None:
  20.         number, src = match.groups()
  21.         yield eval(number), src
  22.  
  23.  
  24. def parse_string(src):
  25.     match = string_regex.match(src)
  26.     if match is not None:
  27.         string, src = match.groups()
  28.         yield eval(string), src
  29.  
  30. def parse_word_generator(word, value=None):
  31.     l = len(word)
  32.     def result(src):
  33.         if src.startswith(word)==True:
  34.             yield value, src[l:].lstrip()
  35.     return result
  36.  
  37. parse_true = parse_word_generator("true", True)
  38. parse_false = parse_word_generator("false", False)
  39. parse_null = parse_word_generator("null", None)
  40.  
  41. def parse_value(src):
  42.     for match in chain(
  43.         parse_string(src),
  44.         parse_number(src),
  45.         parse_true(src),
  46.         parse_false(src),
  47.         parse_null(src),
  48.         parse_object(src),
  49.  
  50.     ):
  51.         yield match
  52.  
  53. parse_comma = parse_word_generator(",")
  54. parse_left_curly_bracket = parse_word_generator("{")
  55. parse_right_curly_bracket = parse_word_generator("}")
  56.  
  57.  
  58. def parse_object(src):
  59.     for _, src in parse_left_curly_bracket(src):
  60.         for items, src in parse_comma_separated_keyvalues(src):
  61.             for _, src in parse_right_curly_bracket(src):
  62.                 yield items, src
  63.  
  64.  
  65. parse_colon = parse_word_generator(":")
  66.  
  67. def parse_keyvalue(src):
  68.     for key,src in parse_string(src):
  69.         for _,src in parse_colon(src):
  70.             for value,src in parse_value(src):
  71.                 yield {key: value}, src
  72.  
  73.  
  74. def parse_comma_separated_keyvalues(src):
  75.     for keyvalue,ssrc in parse_keyvalue(src):
  76.         for _,ssrc in parse_comma(ssrc):
  77.             for keyvalues,ssrc in parse_comma_separated_keyvalues(ssrc):
  78.  
  79.                 keyvalue.update(keyvalues)
  80.  
  81.                 yield keyvalue, ssrc
  82.  
  83.     for keyvalue, src in parse_keyvalue(src):
  84.  
  85.         yield keyvalue, src
  86.  
  87. def parse(s):
  88.     match = list(parse_value(s))
  89.     result, a = match[0]
  90.     return result
  91.  
  92. f = open('lol.json', 'r', encoding = "utf-8")
  93. string=""
  94. lines=f.readlines()
  95. lines = [line.rstrip() for line in lines]
  96. for line in lines:
  97.     string1="".join(line)
  98.     string=string+string1
  99. print(parse(string))
  100.  
  101.  
  102. end = timer()
  103. print("--- %s seconds ---" % (end - start))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement