ans_structrue_old.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. #!/usr/bin/env/python
  2. # -*- coding:utf-8 -*-
  3. import re
  4. from pprint import pprint
  5. from washutil import table_label_cleal, find_seq_num
  6. # 本文件包含以下函数
  7. # con_ans_split:将传进来的单道题(含答案或解析)按题干、答案、解析 拆分
  8. # ans_structure_total:针对答案部分解析结构化汇总
  9. # ans_structure: 拆分答案,并根据已拆分好的题目item_res 补上答案和解析
  10. # stem_ans_struc_combine: 题干结构化与答案结构化的合并
  11. # manyans_oneline_split(item_str, one_type_num):对一行多个答案的情况进行拆分
  12. # only_parse_split: 拆分出答案和解析,主要针对答案页中的每个题的答案进行拆分
  13. # get_ans_from_parse: 从已知解析中 挑选 答案
  14. # def ans_structure_step1(anss, item_type_classify, item_res):
  15. # """
  16. # 针对答案部分解析结构化汇总
  17. # anss : 整个答案部分
  18. # :return: dd = {'parse': , 'answer': }
  19. # """
  20. # anss = [k for k in anss if k.strip()]
  21. # ans_label = [k for k, a in enumerate(anss) if re.match("【答案】", a.strip())]
  22. # parse_label = [k for k, a in enumerate(anss) if re.match("【解析】", a.strip())]
  23. # if len(ans_label) == 1 and len(parse_label) == 1:
  24. # ans1 = anss[ans_label[0] + 1: parse_label[0]]
  25. # parse1 = anss[parse_label[0]+1:]
  26. # res_ans, flag1 = ans_structure_step2(ans1, item_type_classify, item_res,'group_ans')
  27. # res_parse, flag2 = ans_structure_step2(parse1, item_type_classify, item_res, 'group_parse')
  28. # if flag1 == flag2 == 1:
  29. # for idx, item_r in enumerate(item_res):
  30. # if not res_ans[idx]['answer']:
  31. # if not res_parse[idx]['answer']:
  32. # item_res[idx]['answer'] = "见解析"
  33. # else:
  34. # item_res[idx]['answer'] = res_parse[idx]['answer']
  35. # else:
  36. # item_res[idx]['answer'] = res_ans[idx]['answer']
  37. #
  38. # if not res_ans[idx]['parse']:
  39. # item_res[idx]['parse'] = res_parse[idx]['parse']
  40. # else: # 解析中的parse肯定有
  41. # item_res[idx]['parse'] = res_ans[idx]['parse']+"<br/>【解析】"+res_parse[idx]['parse']
  42. # return item_res
  43. # elif flag1 == 2:
  44. # return "【答案】组中题型数量与题目中不一致,请重点检查题目序号,重新手输题目序号"
  45. # elif flag2 == 2:
  46. # return "【解析】组中题型数量与题目中不一致,请重点检查题目序号,重新手输题目序号"
  47. # else:
  48. # return '【答案】组和【解析】组中题型数量与题目中均不一致,请重点检查题目序号,重新手输题目序号'
  49. # else:
  50. # res_ans, flag1 = ans_structure_step2(anss, item_type_classify, item_res)
  51. # if flag1 == 1:
  52. # for idx, item_r in enumerate(item_res):
  53. # item_res[idx]['answer'] = res_ans[idx]['answer']
  54. # item_res[idx]['parse'] = res_ans[idx]['parse']
  55. # else:
  56. # # return "答案中题目数量与题目中不一致,①请重点检查题目序号,重新手输题目序号;②将参考答案开头没用的信息去掉;" \
  57. # # "③是否有遗漏答案或答案格式不对;④答案中若存在一行多个答案时,保证每个题的答案间要留有多个空格!"
  58. # return res_ans
  59. # return item_res
  60. #
  61. #
  62. # def ans_structure_step2(anss, item_type_classify, item_res, *group):
  63. # """
  64. # 拆分答案,并根据已拆分好的题目item_res 补上答案和解析
  65. # 有的答案放在表格里,如选择题、填空题、判断题,有的一行多个答案
  66. # 思路:1.先按一行没有多个题答案的情况取答案,数量与题干不同 时 >>>> 2.再按一行多个答案的情况取答案:
  67. # 1)先判断表格,拿到表格的答案;2)一行多个答案
  68. # anss: 一组按所有不重复题号的答案
  69. # item_type_classify: 题目中对各题型的统计
  70. # :return: [{'parse': , 'answer': },{},{}]
  71. # """
  72. # while not anss[0]:
  73. # anss = anss[1:]
  74. # if re.match(".+?省.+?试[卷题]|[^a-zA-Z]*?【专题】", anss[0]):
  75. # anss = anss[1:]
  76. #
  77. # # 预处理: 对答案部分的题号进行处理, 将(\d)类型的题号改为\d、类型
  78. # sub_item_no = [int(no[0]+no[2]) for no in
  79. # re.findall(r'\n\s*([1-9]|[1-4][0-9])\s*[..、、]|\n\s*([1-9]|[1-4][0-9])\s*[..、、].+?\s+([1-9]|[1-4][0-9])\s*[..、、].+?',
  80. # "\n" + "\n".join(anss))]
  81. # if len(sub_item_no) <= 2:
  82. # sub_item_no = [int(no[0]+no[2]) for no in re.findall(r'\n\s*\(([1-9]|[1-4][0-9])\)\s*[..、、]?'
  83. # r'|\n\s*\(([1-9]|[1-4][0-9])\)\s*[..、、]?.+?\s+\(([1-9]|[1-4][0-9])\)\s*[..、、]?.+?',
  84. # "\n" + "\n".join(anss))]
  85. # if len(sub_item_no) > 3:
  86. # anss = re.sub(r'\n\s*\(([1-9]|[1-4][0-9])\)\s*[..、、]?', "\n" + r"【@\1、", "\n" + "\n".join(anss))
  87. # anss = re.sub(r'(\n【@([1-9]|[1-4][0-9])、.+?\s+)\(([1-9]|[1-4][0-9])\)\s*[..、、]?', r"\1【@\3、", anss)
  88. # anss = anss.replace("【@", "").split("\n")[1:]
  89. #
  90. # # --------- 一行多个答案的情况----存在一行中有选择题和填空题答案,填空题答案尽量每题占一行----------
  91. # all_item_ans = []
  92. # table_ans = []
  93. # ans_no = []
  94. # while anss and "table" in anss[0]: # 答案以表格形式呈现, 表格应放在前两行位置,不要插在答案中间
  95. # row_list = [] # 要求表格形式为 横纵分明 ,不存在合并
  96. # for tt in re.finditer('<tr>(((?!(</?tr>)).)*)</tr>', anss[0], re.S): # 先划分每行
  97. # tt_list = re.split(r'</p></td>|<td><p>|</td><td>|</td>|<td>', tt.group(1)) # 再划分每列
  98. # # row_list.append([col for col in tt_list if col.strip()]) # 也有可能答案为空
  99. # row_list.append(tt_list)
  100. # if row_list:
  101. # print("^^^^^^存在答案放在表格里的情况!^^^^^^^")
  102. # if len(row_list) % 2 != 0:
  103. # print('表格形式呈现的答案不是偶数行')
  104. # else:
  105. # # print("row_list:", row_list)
  106. # for k, v in enumerate(row_list):
  107. # # print('-----',v)
  108. # if (k + 1) % 2 == 1: # 奇数行==》答案序号行
  109. # item_no = [int(i) if re.sub(r"[^\d]", "", i) else -1 for i in v]
  110. # item_no_st = [num for num, i in enumerate(item_no) if i != -1] # 可能开头是-1
  111. # ans_no.extend([i for i in item_no if i != -1]) # 表格序号
  112. # table_ans.extend(row_list[k + 1][item_no_st[0]: item_no_st[-1] + 1]) # 表格答案
  113. # anss = anss[1:]
  114. # # 先按一行没有多个题答案的情况取答案
  115. # anss_str = table_label_cleal("\n" + "\n".join(anss))
  116. # if re.search("<table>.+?</table>", anss_str) is None:
  117. # anss_str = anss_str.split("</table>")[-1].replace("</div>", "")
  118. # anss_str = re.sub(r"([A-H])\s*[..](\s*([1-4][0-9]|[1-9])\s*[..、、])", r"\1 \2", anss_str)
  119. # anss_str = re.sub(r"([;;])(\s*([1-4][0-9]|[1-9])\s*[.、、])", r"\1 \2", anss_str)
  120. #
  121. # rest_item_split = re.split(r'\n+\s*[1-4][0-9]\s*[..、、]|\n+\s*[1-9]\s*[..、、]', anss_str)
  122. # if not rest_item_split[0]:
  123. # rest_item_split = rest_item_split[1:]
  124. # all_item_ans.extend(table_ans)
  125. # all_item_ans.extend(rest_item_split)
  126. # print("表格答案:", table_ans)
  127. # pprint(all_item_ans)
  128. # # ------------先按没有一行多个答案的情况-------------------
  129. # if item_type_classify and len(all_item_ans) == sum(list(item_type_classify.values())):
  130. # res1 = []
  131. # for num1, one_ans in enumerate(all_item_ans):
  132. # parse = only_parse_split(one_ans, item_res[num1]["item_topic_name"], item_res[num1]['content'])
  133. # res1.append(parse)
  134. # return res1, 1
  135. # elif not item_type_classify and len(all_item_ans) == len(item_res):
  136. # res1 = []
  137. # for num1, one_ans in enumerate(all_item_ans):
  138. # parse = only_parse_split(one_ans, item_res[num1]["item_topic_name"], item_res[num1]['content'])
  139. # res1.append(parse)
  140. # return res1, 1
  141. # else: # 答案个数与题目不一致时,再按一行多个答案处理(题目个数正常,答案个数比题目少时)
  142. # print('-----存在一行多个答案的情况-----')
  143. # all_item_ans = []
  144. # all_item_ans.extend(table_ans)
  145. # # 再按一行多个答案的情况取答案
  146. # manyans_oneline_split = re.split(r'\n\s*[1-4][0-9]\s*[..、、]|\n\s*[1-9]\s*[..、、]'
  147. # r'|(?<![::..、、+\-*/=])\s[1-4][0-9]\s*[..、、]|(?<![::..、、+\-*/=])\s[1-9]\s*[..、、]'
  148. # r'|\s{2,}[1-4][0-9]\s*[..、、]|\s{2,}[1-9]\s*[..、、]', anss_str)
  149. #
  150. # temp_no = re.findall(r'\n\s*([1-4][0-9]|[1-9])\s*[..、、]'
  151. # r'|(?<![::..、、+\-*/=])\s([1-4][0-9]|[1-9])\s*[..、、]|\s{2,}([1-4][0-9]|[1-9])\s*[..、、]', anss_str)
  152. # temp_no = [int("".join(i)) for i in temp_no]
  153. # # print("temp_no:",temp_no)
  154. # # print('manyans_oneline_split:', manyans_oneline_split, len(manyans_oneline_split))
  155. # if not temp_no and not all_item_ans: # 没有表格答案的情况,如1~10 ACBBD...
  156. # row_ans = re.findall("[A-Z](?<!\))", manyans_oneline_split[0].strip())
  157. # all_item_ans.extend(row_ans)
  158. # temp_no = re.findall("(\d)-(\d{1,2})", manyans_oneline_split[0])
  159. # for t in temp_no:
  160. # ans_no.extend(list(range(int(t[0]), int(t[1])+1)))
  161. # if row_ans:
  162. # manyans_oneline_split = []
  163. # elif temp_no and not manyans_oneline_split[0]:
  164. # manyans_oneline_split = manyans_oneline_split[1:]
  165. # ans_no.extend(temp_no)
  166. # elif re.match("A-Z", manyans_oneline_split[1].strip()) is None and \
  167. # len(re.findall("[A-Z](?<!\))", manyans_oneline_split[0].strip())) == len(item_res) - (len(manyans_oneline_split)-1):
  168. # print('第一行答案不是以题号形式一个个给出')
  169. # row_ans = re.findall("[A-Z](?<!\))", manyans_oneline_split[0].strip())
  170. # all_item_ans.extend(row_ans)
  171. # manyans_oneline_split = manyans_oneline_split[1:]
  172. # if temp_no and temp_no[0] > len(row_ans):
  173. # ans_no.extend(list(range(temp_no[0]-len(row_ans), temp_no[0])))
  174. # ans_no.extend(temp_no)
  175. # else:
  176. # print("答案序号有问题!!")
  177. # ans_no.extend(['']*len(row_ans))
  178. # ans_no.extend(temp_no)
  179. # # print("manyans_oneline_split:************")
  180. # # pprint(manyans_oneline_split)
  181. # print("ans_no:", ans_no)
  182. # all_item_ans.extend(manyans_oneline_split)
  183. # combine_res = stem_ans_struc_combine(item_type_classify, item_res, all_item_ans, ans_no, group)
  184. # # if not combine_res:
  185. # # return '答案数量与题干数量不一致,请检查题干和答案中的题号,是否有遗漏答案或答案格式不对;' \
  186. # # '答案中若存在一行多个答案时,保证每个题的答案间要留有多个空格!', 2
  187. #
  188. # return combine_res
  189. # def stem_ans_struc_combine(item_type_classify, item_res, all_item_ans, ans_no, group):
  190. # """
  191. # 题干结构化与答案结构化的合并
  192. # :return:
  193. # """
  194. # print("item_type_classify:", item_type_classify)
  195. # print("题干中的题目数量:", len(item_res))
  196. # print("答案中的题目数量:", len(all_item_ans))
  197. # if item_type_classify and len(all_item_ans) == sum(list(item_type_classify.values())):
  198. # res1 = []
  199. # for num1, one_ans in enumerate(all_item_ans):
  200. # parse = only_parse_split(one_ans, item_res[num1]["item_topic_name"], item_res[num1]['content'])
  201. # res1.append(parse)
  202. # return res1, 1
  203. # elif not item_type_classify and len(all_item_ans) == len(item_res):
  204. # res1 = []
  205. # for num1, one_ans in enumerate(all_item_ans):
  206. # parse = only_parse_split(one_ans, item_res[num1]["item_topic_name"], item_res[num1]['content'])
  207. # res1.append(parse)
  208. # return res1, 1
  209. # else:
  210. # print('答案数量与题干数量不一致,请检查题干和答案中的题号,是否有遗漏答案或答案格式不对;',
  211. # '答案中若存在一行多个答案时,保证每个题的答案间要留有多个空格!', 2)
  212. # print("试题个数:", len(item_res))
  213. # print("答案中的题号:", ans_no)
  214. # # ----------------------是否正确对上序号还需进一步验证!!!!!!!!!!-------------------------------
  215. # res1 = []; simp_res = []
  216. # err_n = 0 # 与题目id没对上号的个数, 默认答案一般也是从前往后排序
  217. # for k, one_item in enumerate(item_res): # 以题目为主
  218. # search_range = ans_no
  219. # if k+3-err_n <= len(ans_no):
  220. # search_range = ans_no[k-err_n:k+3-err_n]
  221. # elif k-err_n < len(ans_no):
  222. # search_range = ans_no[k-err_n:]
  223. # # print("答案的搜索范围search_range:",search_range)
  224. # if one_item['item_id'] in search_range: # 在对应位置前
  225. # ans_no_st = [k1+k-err_n for k1, v1 in enumerate(search_range) if v1 == one_item['item_id']] # 默认取第一个作为对应答案
  226. # # print("答案的位置{0}:{1}, ----对应题目id:{2}".format(ans_no_st, all_item_ans[ans_no_st[0]],one_item['item_id']))
  227. # parse = only_parse_split(all_item_ans[ans_no_st[0]], one_item["item_topic_name"], one_item['content'])
  228. # one_item['answer'] = parse['answer']
  229. # one_item['parse'] = parse['parse']
  230. # res1.append(one_item)
  231. # if group == 'group_ans':
  232. # simp_res.append({'parse': "", 'answer': parse['answer'],'item_id':one_item['item_id']})
  233. # if group == 'group_parse':
  234. # simp_res.append({'parse': parse['parse'], 'answer': parse['answer'],'item_id':one_item['item_id']})
  235. # else:
  236. # err_n += 1
  237. # one_item.update({'parse': "", 'answer': ""})
  238. # res1.append(one_item)
  239. # if group:
  240. # simp_res.append({'parse': '', 'answer': '', 'item_id': one_item['item_id']})
  241. # if simp_res:
  242. # return simp_res, 1
  243. #
  244. # return res1, 2
  245. # def one2more_ans_split(item_list, item_type):
  246. # """
  247. # 对一行多个答案的情况进行拆分
  248. # :return:
  249. # """
  250. # manyans_oneline_split = []
  251. # while item_list and \
  252. # len(re.findall(r"(^|\s+)[1-9][0-9]?\s*[..、、]\s*(【答案】|答案\s*[::]?)?\s*[A-D]", item_list[0])) > 1:
  253. # print('选择题存在一行多个答案的情况!!!') # 主要以选择题的为主
  254. #
  255. # # 处理 1.xxx 2.xxx 3.xxx
  256. # ans_line1 = item_list[0]
  257. # if not item_type or item_type.replace("题", "") in ["单选", "多选", "选择", "单项选择", "多项选择"]:
  258. # ans_line1 = re.sub(r"[^A-D\d..、、()]", "", item_list[0])
  259. #
  260. # if re.match(r"[1-9][0-9]?[..、、][A-D]", ans_line1): # 第一个答案为选择题的情况
  261. # one_ans_split = re.split(r'^\s*[1-9][0-9]?\s*[..、、]|\s+[1-9][0-9]?\s*[..、、]', item_list[0])
  262. # if not one_ans_split[0]:
  263. # one_ans_split = one_ans_split[1:]
  264. # manyans_oneline_split.extend(one_ans_split)
  265. # else: # 第一个答案为非选择题或没有序号的情况
  266. # one_ans_split = re.split(r'^\s*[1-9][0-9]?\s*[..、、]|\s+[1-9][0-9]?\s*[..、、]', item_list[0])
  267. # if not one_ans_split[0]:
  268. # one_ans_split = one_ans_split[1:]
  269. # if manyans_oneline_split and not manyans_oneline_split[-1]: # 序号和答案跨行的情况
  270. # manyans_oneline_split[-1] = one_ans_split[0]
  271. # manyans_oneline_split.extend(one_ans_split[1:])
  272. # else:
  273. # manyans_oneline_split.extend(one_ans_split)
  274. # item_list = item_list[1:]
  275. # # if item_list:
  276. # # ans_line1 = re.sub(r"[^A-D\d..、、]", "", item_list[0])
  277. #
  278. # if manyans_oneline_split and not manyans_oneline_split[-1]:
  279. # print('答案要求:题目序号不在行首时不要与该题答案跨行')
  280. #
  281. # # 填空题答案也可能一行多个
  282. # if item_type == '填空题': # 在题干题型明确时
  283. # one_type_ans_split = re.split(r'\n\s*[1-9][0-9]?\s*[..、、]|(?<![::])\s+[1-9][0-9]?\s*[..、、](?!png)',
  284. # table_label_cleal("\n"+"\n".join(item_list)))
  285. # while not one_type_ans_split[0]:
  286. # del one_type_ans_split[0]
  287. # one_type_ans_split.extend(one_type_ans_split)
  288. # return one_type_ans_split
  289. # 对item_list剩余文本按题号继续拆分,包括一行多个答案的情况
  290. # while re.match("\n\s*([1-9][0-9]?)\s*[..、、].+?\s+([1-9][0-9]?)\s*[..、、]", item_list[0]):
  291. # item_no_seq = re.findall("[\n\s]\s*([1-9][0-9]?)\s*[..、、]", "\n" + "\n".join(item_list))
  292. # item_no_seq = [int(one) for one in item_no_seq]
  293. # # print("item_no_seq:",find_seq_num(item_no_seq))
  294. # if len(find_seq_num(item_no_seq)) == 1:
  295. # all_type_ans_split = re.split(r'\n\s*[1-9][0-9]?\s*[..、、]|(?<![::])\s+[1-9][0-9]?\s*[..、、](?!png)',
  296. # table_label_cleal("\n" + "\n".join(item_list)))
  297. # while not all_type_ans_split[0].strip():
  298. # del all_type_ans_split[0]
  299. # manyans_oneline_split.extend(all_type_ans_split)
  300. # return manyans_oneline_split
  301. # def get_ans_from_parse(item_parse, item_type, res_con):
  302. # """
  303. # 从已知解析中 挑选 答案
  304. # :param item_parse: 总解析
  305. # :param item_type: 题型
  306. # :return:
  307. # """
  308. # item_parse = re.split("【点评】|【点睛】", item_parse)[0].strip()
  309. # # 将解析中末尾出现的图片去掉
  310. # while re.search('\n\s*<imgsrc\d+\sw_h=(\d+\*\d{3})/>\s*$', item_parse):
  311. # item_parse = re.sub('\n\s*<imgsrc\d+\sw_h=(\d+\*\d{3})/>\s*$', "", item_parse)
  312. # item_ans = ""
  313. # if item_type.replace("题", "") in ["单选", "多选", "选择", "单项选择", "多项选择"]:
  314. # ans = re.search(r'故选\s*[::]?\s*<imgsrc\d+\sdata-latex="\$?([A-Z;;和与、、\s]+)\$?"/>'
  315. # r'|故选\s*[::]?\s*([A-Z;;和与、、\s]+)', item_parse.replace("$", ""))
  316. # if ans:
  317. # item_ans = ans.group(1) if ans.group(1) is not None else ans.group(2)
  318. # item_ans = re.sub(r"[.;;.]\s*$", "", item_ans)
  319. # elif not ans:
  320. # item_ans = "见解析"
  321. # elif item_type:
  322. # ans0 = re.search(r'故选\s*[::]?\s*([A-Z;;和与、、\s]+)[..;;。]?$', item_parse) # 试验题中可能还有选择题
  323. # ans01 = re.search(r'故选\s*[::]\s*<imgsrc\d+\sdata-latex="\$?([A-Z;;和与、、\s]+)\$?"/>', item_parse) # 选择题的题型可能前面分错
  324. # ans1 = re.search(r'(故|因[而此]|所以)\s*[::]?\s*(答案分?别?[为是填]?|填)\s*[::]?\s*(((?!(<img)).)+?)[..]?\s*(\n|$)', item_parse)
  325. # ans11 = re.search(r'((?<!解)答\s*[::]|整理得\s*[::]?)\s*(.+?)([..;;]?\s*$|[..]\s*\n)', item_parse)
  326. # ans2 = re.search(r'(故|因[而此]|所以)\s*[::]?\s*(答案分?别?[为是填]?|填)\s*[::]?\s*(<imgsrc.+?/>)[..]?\s*(\n|$)', item_parse, re.S)
  327. # ans22 = re.search(r'(故|因[而此]|所以)\s*[::]?\s*(答案分?别?[为是填]?|填)\s*[::]?\s*([^∴∵因所故即【】]+?)([..]\s*(\n|$)|$)', item_parse)
  328. # ans21 = re.search(r'综上所述\s*[::]\s*([^∴∵故因所即【】]+?)[..;;]\s*$', item_parse)
  329. # ans3 = re.search(r'(故|因[而此]|所以|∴)\s*[::]?.+?[为是填]\s*[::]?\s*([^∴∵故因所即【】]+?)([..;;,,]\s*$|[..]\s*\n)', item_parse)
  330. # ans31 = re.search(r'(故|因[而此]|所以|∴)\s*([^当为是填∴∵故因所即则【】]+?)[..;;]\s*$', item_parse)
  331. # ans32 = re.search(r'(故|因[而此]|所以)\s*[::]?[^当为是填∴∵故因所即【】]+?[为是填]\s*[::]?\s*(<imgsrc.+?/>)[..]?\s*(\n|$)',
  332. # item_parse, re.S)
  333. # ans4 = re.search(r'\n\s*[==]([^=\n]+?)[..]?\s*$', item_parse)
  334. # ans42 = re.search(r'[==](?!")(((?!([故=∴即]|原式|因[而此]|所以|\n|=[^"])).)+?)[..]?\s*$', item_parse)
  335. # ans41 = re.search(r'原式\s*[==].+?[==](?!")(((?!(=|=[^"])).)+?|\s*<imgsrc.+?/>)([..]?\s*$|[..]\s*\n)', item_parse)
  336. # if not (item_type == '填空题' and len(re.findall(r"_{2,}|_+([^_]*?)_+", res_con)) == 1) and \
  337. # len(re.findall(r"[((]\d[))]|[\n::;;。】]([((](i{1,3}|[ⅰⅱⅲⅳⅠⅡⅢIV①②③④])[))]|[①②③④]\s*(?![+-]))",
  338. # item_parse.replace(" ", ""))) > 1 or "证明" in item_parse:
  339. # item_ans = "见解析"
  340. # elif ans0:
  341. # item_ans = ans0.group(1)
  342. # elif ans01:
  343. # item_ans = ans01.group(1)
  344. # elif ans1 or ans11:
  345. # item_ans = ans1.group(3) if ans1 else ans11.group(2)
  346. # elif ans2:
  347. # item_ans = ans2.group(3)
  348. # elif ans22:
  349. # item_ans = ans22.group(3)
  350. # elif ans21:
  351. # item_ans = ans21.group(1)
  352. # elif (ans3 or ans31 or ans32) and '证明' not in item_parse:
  353. # if ans3:
  354. # item_ans = ans3.group(2)
  355. # if ans31:
  356. # item_ans = ans31.group(2)
  357. # if ans32:
  358. # item_ans = ans32.group(2)
  359. # elif (ans4 or ans41 or ans42) and '证明' not in item_parse:
  360. # if ans4:
  361. # item_ans = ans4.group(1)
  362. # if ans41:
  363. # item_ans = ans41.group(1)
  364. # if ans42:
  365. # item_ans = ans42.group(1)
  366. # else:
  367. # item_ans = "见解析"
  368. # return item_ans
  369. # def con_ans_split(one_item_list, item_topic_name, topic_no):
  370. # """
  371. # 将传进来的单道题(含答案或解析)按题干、答案、解析 拆分
  372. # :param one_item_list: [str,str,str] 每个元素为一行数据, ocr一行行识别, 保留每行数据;如果是word,直接用wordbin拿到html格式进行解析
  373. # :param item_topic_name:题型
  374. # :param topic_no:题号
  375. # :return: one_item:{"content":xxxx,"answer":xxx,"parse":xxx}
  376. # """
  377. # pattern1 = re.compile(r"【(.*?)\s+(.*?)】|【(.*?)<imgsrc.+?/>(.*?)】")
  378. # con0 = re.sub(r"】[::]", "】", "#&#".join(one_item_list)) # 是否换行后面再考虑
  379. # con0 = re.sub(r"\[来源.*?\]", "", con0).replace("\xa0", " ").replace("\u3000", " ")
  380. # while re.search(pattern1, con0):
  381. # con0 = re.sub(pattern1, r"【\1\2】", con0) # 去掉 【】 中的图片和空格
  382. #
  383. # big_struc_dict = {"item_topic_name": item_topic_name, "topic_no": topic_no}
  384. # if re.search("【(答案|[解分][析答]|详解)】", con0):
  385. # label = re.findall("【(答案|[解分][析答]|详解|点[评睛])】", con0)
  386. # label_split = re.split(r"【答案】|【[解分][析答]】|【详解】|【点[评睛]】", con0)
  387. # big_struc_dict1 = dict(zip(label, label_split[1:]))
  388. # big_struc_dict1['con'] = label_split[0]
  389. # # 将键值为空的键删掉
  390. # big_struc_dict.update({k: v for k, v in big_struc_dict1.items() if v.replace("#&#", "").strip() != ""})
  391. # else:
  392. # big_struc_dict['con'] = con0
  393. #
  394. # return big_struc_dict
  395. if __name__ == '__main__':
  396. # oneitem = {'content': '7.化简<img src="files/image7.jpeg" style="width: 28.8pt; height: '
  397. # '28.8pt" width="38" height="38" />÷<img src="files/image8.jpeg" '
  398. # 'style="width: 47.95pt; height: 30.7pt" width="64" height="41" '
  399. # '/>的结果是(\u3000\u3000)\n'
  400. # 'A.<img src="files/image9.jpeg" style="width: 21.6pt; height: '
  401. # '28.8pt" width="29" height="38" />B.<img src="files/image10.jpeg" '
  402. # 'style="width: 21.7pt; height: 26.2pt" width="29" height="35" '
  403. # '/>C.<img src="files/image11.jpeg" style="width: 21.6pt; height: '
  404. # '28.8pt" width="29" height="38" />D.<img src="files/image12.jpeg" '
  405. # 'style="width: 21.7pt; height: 26.2pt" width="29" height="35" />\n'}
  406. # res = one_item_parse(oneitem, '单选题')
  407. # oneitem = ["1.下列说法正确的是(  )","A.射线是高速运动的电子流","B.氢原子可通过吸收光子实现从低能级向高能级跃迁",
  408. # "C.太阳辐射能量的主要来源是太阳内部发生的重核裂变","D.的半衰期是3.8天,1克经过7.6天后全部发生衰变",
  409. # "【答案】B","【解析】","【分析】","【详解】","A.γ射线是电磁波,故A错误;","B.按照波尔理论,氢原子吸收光子后,将从低能级向高能级跃迁,故B正确;",
  410. # "C.太阳辐射能量的主要来源是太阳中发生的轻核聚变,故C错误;","D.的半衰期是3.8天,7.6天是2个半衰期,根据可知,有发生衰",
  411. # "变,还剩下克没有衰变,故D错误。","故选B。"]
  412. # num = 1
  413. # item_type = '选择题'
  414. # res = con_ans_split(oneitem, item_type, num)
  415. # pprint(res)
  416. one_ans = '故答案为:3.\n'
  417. parse = only_parse_split(one_ans, "填空题")
  418. print(parse)
  419. # a = dict(zip(["2","2","3"], [2,4,6]))
  420. # print(a)
  421. con = '【分析】 首先根据分式值为零的条件,可得<img src="999image136.png" style="width: 77.35pt; height: 33.85pt" width="103" height="45" />;然后根据因式分解法解一元二次方程的步骤,求出x的值为多少即可.\n【解答】 解:∵分式<img src="999image137.png" style="width: 57.5pt; height: 31.7pt" width="77" height="42" />的值为0,\n<p>∴<img src="999image138.png" style="width: 77.35pt; height: 33.85pt" width="103" height="45" />\n<p>解得x=3,\n<p>即x的值为3.\n<p>故答案为:3.\n【点评】 (1)此题主要考查了分式值为零的条件'
  422. con = re.search(r'(故|因[而此]|所以)\s*[::]?\s*(答案分?别?[为是填]?|填)\s*[::]?\s*(((?!(<img)).)+?)[..]?\s*(\n|$)', con)
  423. print(':',con.group(3))