Advertisement
VTsilaLETImogila

Untitled

Nov 5th, 2019
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.25 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. def parse_string(src):
  24.     match = string_regex.match(src)
  25.     if match is not None:
  26.         string, src = match.groups()
  27.         yield eval(string), src
  28.  
  29. def parse_word(word, value=None):
  30.     l = len(word)
  31.     def result(src):
  32.         if src.startswith(word)==True:
  33.             yield value, src[l:].lstrip()
  34.  
  35.     return result
  36.  
  37. parse_true = parse_word("true", True)
  38. parse_false = parse_word("false", False)
  39. parse_null = parse_word("null", None)
  40.  
  41. def parse_value(src):
  42.     for match in chain(
  43.         parse_string(src),
  44.         parse_number(src),
  45.  
  46.         parse_object(src),
  47.         parse_true(src),
  48.         parse_false(src),
  49.         parse_null(src),
  50.     ):
  51.         yield match
  52.         return
  53.  
  54. parse_comma = parse_word(",")
  55. parse_left_curly_bracket = parse_word("{")
  56. parse_right_curly_bracket = parse_word("}")
  57.  
  58. def parse_object(src):
  59.  
  60.     for _, tsrc in parse_left_curly_bracket(src):
  61.         for _, tsrc in parse_right_curly_bracket(tsrc):
  62.             yield {}, tsrc
  63.             return
  64.  
  65.     for _, src in parse_left_curly_bracket(src):
  66.         for items, src in parse_comma_separated_keyvalues(src):
  67.             for _, src in parse_right_curly_bracket(src):
  68.                 yield items, src
  69.  
  70.  
  71. parse_colon = parse_word(":")
  72.  
  73. def parse_keyvalue(src):
  74.     for key,src in parse_string(src):
  75.         for _,src in parse_colon(src):
  76.             for value,src in parse_value(src):
  77.                 yield {key: value}, src
  78.  
  79.  
  80. def parse_comma_separated_keyvalues(src):
  81.     for keyvalue,ssrc in parse_keyvalue(src):
  82.         for _,ssrc in parse_comma(ssrc):
  83.             for keyvalues,ssrc in parse_comma_separated_keyvalues(ssrc):
  84.  
  85.                 keyvalue.update(keyvalues)
  86.                 yield keyvalue, ssrc
  87.                 return
  88.  
  89.     for keyvalue, src in parse_keyvalue(src):
  90.         yield keyvalue, src
  91.  
  92. def parse(s):
  93.     s = s.strip()
  94.     match = list(parse_value(s))
  95.  
  96.     result, src = match[0]
  97.  
  98.     return result
  99.  
  100.  
  101.  
  102. end = timer()
  103. print("--- %s seconds ---" % (end - start))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement