danti_structure.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #!/usr/bin/env/python
  2. # -*- coding:utf-8 -*-
  3. """
  4. 单题再解析、结构化
  5. """
  6. import re
  7. from structure.option import option_structure
  8. from utils.equation_extract import get_simpstr2eqn, get_equation_instr
  9. from utils.html_again_parse import css_label_wash
  10. from utils.washutil import base642img, css_conflict_deal, convert_huanhang
  11. from utils.field_eq2latex import latex_wash
  12. from structure.dati2slave import get_slave
  13. def single_parse(one_item, item_type, wordid):
  14. """
  15. rtype:题型
  16. :return:
  17. """
  18. # if re.search("选择|不定选择|多选|单选", rtype):
  19. # if "【选项】" not in one_item:
  20. # return "请不要将本编辑框自带的“【选项】、【答案】、【解析】”字段删除"
  21. # if "【答案】" not in one_item or "【解析】" not in one_item:
  22. # return "请不要将本编辑框自带的“【答案】、【解析】”字段删除"
  23. print("原始:")
  24. # print(one_item)
  25. one_item = css_label_wash(one_item)
  26. one_item = re.sub("</?p>|<h[12345]", "", one_item)
  27. one_item = one_item.replace("&nbsp;&nbsp;", " ").replace("&nbsp;", " ")
  28. # print("去css:")
  29. # print(one_item)
  30. one_item = base642img(one_item, wordid)
  31. # one_item = css_conflict_deal(one_item)
  32. one_item = re.sub(r"(<br\s*/?>\s*|\n\s*)+<(/?table( .*?)?|/?tbody( .*?)?|/?t[rhd]( .*?)?)>\s*(<br\s*/?>\s*|\n\s*)+",
  33. r"<\2>", one_item)
  34. one_item = re.sub(r'(</?t[drh]( .*?")?>|</?table>|</?tbody>)(<br\s*/?>|\n)+', r"\1", one_item, flags=re.S)
  35. one_item = re.sub(r"\\\(\s*{\s*\}\s*\\\)", "", one_item)
  36. one_item = re.sub(r"\\\(\s*\\\)", "", one_item)
  37. one_item = re.sub(r"\\\(|\\\)", "$", one_item)
  38. one_item = latex_wash(one_item, 1)
  39. res_list = re.split(r"(\n+【答案】|\n+【解析】)", one_item)
  40. if len(res_list) > 5:
  41. return "编辑后的文本出现多个【答案】或【解析】字段,请删除,每个字段只保留唯一且单独成行"
  42. elif len(res_list) < 5:
  43. res_list = re.split(r"(【答案】|【解析】)", one_item)
  44. if len(res_list) > 5:
  45. return "编辑后的文本出现多个【答案】或【解析】字段,请删除,每个字段只保留唯一且单独成行"
  46. # elif len(res_list) < 5:
  47. # return "编辑后的文本掉了【答案】或【解析】字段,请添加,每个字段保留唯一"
  48. new_item_struct = {}
  49. new_item_struct["key"] = ""
  50. new_item_struct["parse"] = ""
  51. new_item_struct["stem"] = res_list[0]
  52. if len(res_list) == 5:
  53. if res_list[1].strip() == "【答案】" and res_list[3].strip() == "【解析】":
  54. new_item_struct["key"] = res_list[2]
  55. new_item_struct["parse"] = res_list[4]
  56. elif res_list[1].strip() == "【解析】" and res_list[3].strip() == "【答案】":
  57. new_item_struct["key"] = res_list[4]
  58. new_item_struct["parse"] = res_list[2]
  59. else:
  60. return "编辑后的文本出现多个【答案】或【解析】字段,请修改,每个字段只保留唯一且单独成行"
  61. elif len(res_list) > 2:
  62. if res_list[1].strip() == "【答案】":
  63. new_item_struct["key"] = res_list[2]
  64. elif res_list[1].strip() == "【解析】":
  65. new_item_struct["parse"] = res_list[2]
  66. item_ids = re.findall("^([1-9][0-9]|[1-9])\s*[..、、]", new_item_struct["stem"].strip())
  67. new_item_struct["topic_num"] = int(item_ids[0]) if item_ids else 0
  68. new_item_struct["stem"] = re.sub("^([1-9][0-9]|[1-9])\s*[..、、]", "", new_item_struct["stem"].strip())
  69. if len(new_item_struct["stem"].strip()) < 3:
  70. return "题干为空,请补充完整"
  71. # 选项再解析
  72. new_item_struct["errmsgs"] = []
  73. if re.search("选择|不定选择|多选|单选", item_type):
  74. new_item_struct = option_structure(new_item_struct, new_item_struct["stem"], new_item_struct["key"], 1, 1)
  75. if new_item_struct["errmsgs"]:
  76. return ";;".join(new_item_struct["errmsgs"])
  77. if 'options' in new_item_struct and any([True for i in new_item_struct['options']
  78. if not i.replace(":", "").strip()]): # 空选项中:被当成了内容
  79. return "存在选项为空,请补充完整"
  80. new_item_struct["answer_type"] = "选择题"
  81. else:
  82. new_item_struct["type"] = item_type
  83. new_item_struct = get_slave(new_item_struct, new_item_struct["stem"], new_item_struct["parse"], new_item_struct["key"])
  84. if "item_id" in new_item_struct:
  85. del new_item_struct["item_id"]
  86. # 换行符替换
  87. convert_huanhang(new_item_struct)
  88. # new_item_struct["stem"] = new_item_struct["stem"].strip().replace("\n\n", "\n").replace("\n", "<br/>") # 2020/4/10 gai
  89. # new_item_struct["key"] = new_item_struct["key"].strip().replace("\n\n", "\n").replace("\n", "<br/>")
  90. # new_item_struct["parse"] = new_item_struct["parse"].strip().replace("\n\n", "\n").replace("\n", "<br/>")
  91. # if "options" in new_item_struct: # 对选项部分进行格式处理 get_equation_instr
  92. # for i in range(len(new_item_struct['options'])):
  93. # new_item_struct['options'][i] = new_item_struct['options'][i].strip().replace("\n\n", "\n")\
  94. # .replace("\n", "<br/>")
  95. new_item_struct["errmsgs"] = ";".join(new_item_struct["errmsgs"])
  96. # print(new_item_struct)
  97. return new_item_struct
  98. if __name__ == '__main__':
  99. from pprint import pprint
  100. html = r'''
  101. <div class="stem-wraper" data-v-f9692732=""><span class="topic-number" data-v-f9692732="">11.</span><span class="stem" data-v-f9692732="">在2A(g)+B(g)<img src="http://zxhx-pro-1302712961.cos.ap-beijing.myqcloud.com/zyk/uploadfiles/wording/6232c845a7d375f4518b9b22/image8.png" width="36px" height="10px">3C(g)+4D(g)反应中,表示该反应速率最快的是<br><br>A、v(A)=8mol·L<sup>-1</sup>·min<sup>-1<br></sup>B、v(B)=0.3mol·L<sup>-1</sup>·s<sup>-1<br></sup>C、v(C)=0.6mol·L<sup>-1</sup>·s<sup>-1<br></sup>D、v(D)=1mol·L<sup>-1</sup>·s<sup>-1</sup></span></div>
  102. <ul class="stem-options" data-v-f9692732="">
  103. <li data-v-f9692732="">&nbsp;</li>
  104. </ul>
  105. <div class="topic-analysis" data-v-f9692732="">
  106. <div class="topic-analysis-content" data-v-f9692732=""><span class="analysis-prefix" data-v-f9692732="">【答案】</span><span data-v-f9692732="">B</span></div>
  107. <div class="topic-analysis-content" data-v-f9692732=""><span class="analysis-prefix" data-v-f9692732="">【解析】</span><span data-v-f9692732="">都换算成用B表示的速率,分别为:<br>A.v(B)=<span class="math-tex">\(\frac{\text{8mol}\cdot {\text{L}}^{\text{-1}}·{\text{min}}^{\text{-1}}}{\text{2}×\text{60s}\cdot {\text{min}}^{\text{-1}}}\)</span>=0.067 mol·L<sup>-1</sup>·s<sup>-1</sup>;<br>B.v(B)=0.3mol·L<sup>-1</sup>·s<sup>-1</sup>;<br>C.v(B)=<span class="math-tex">\(\frac{\text{0}\text{.6mol}·{\text{L}}^{\text{-1}}·{\text{s}}^{\text{-1}}}{\text{3}}\)</span>=0.2mol·L<sup>-1</sup>·s<sup>-1</sup>;<br>D.v(B)=<span class="math-tex">\(\frac{\text{1mol}·{\text{L}}^{\text{-1}}·{\text{s}}^{\text{-1}}}{\text{4}}\)</span>=0.25mol·L<sup>-1</sup>·s<sup>-1</sup>;所以B选项最快,故选B。<br>【点睛】<br>比较用不同物质表示的反应速率快慢时,根据速率之比等于方程式的化学计量数之比,换算成用同一种物质表示的速率,同时还要注意单位的统一。<br></span></div>
  108. </div>
  109. '''
  110. hml2 = """
  111. <div class="stem-wraper" data-v-35454a0f=""><span class="topic-number" data-v-35454a0f="">7.</span><span class="stem" data-v-35454a0f="">农业生产中的一些栽培措施可以影响作物的生理活动,促进作物的生长发育,达到增加产量等目的。回答下列问题:<br>(1)中耕松土、科学施肥、合理灌溉等措施都能有效提高农作物的产量。中耕是指作物生长期中,在植株之间去除杂草并进行松土的一项栽培措施,该栽培措施对作物的作用有____________(答出1点即可)。农田施肥的同时,往往需要适当浇水,此时浇水的原因是____________________(答出1点即可)。</span></div>
  112. <div class="topic-analysis" data-v-35454a0f="">
  113. <div class="topic-analysis-content" data-v-35454a0f=""><span class="analysis-prefix" data-v-35454a0f="">【答案】</span><span data-v-35454a0f="">(1)减少杂草对水分、矿质元素和光的竞争增加土壤氧气含量,促进根系的呼吸作用 肥料中的矿质元素只有溶解在水中才能被作物根系吸收 (2)叶绿体类囊体薄膜 C<sub>5</sub> 叶绿体基质 (3)A和D 作物A光饱和点高且长得高,可利用上层光照进行光合作用;作物D光饱和点低且长得矮,与作物A间作后,能利用下层弱光进行光合作用</span></div>
  114. <div class="topic-analysis-content" data-v-35454a0f=""><span class="analysis-prefix" data-v-35454a0f="">【解析】</span><span data-v-35454a0f="">(1)去除杂草减小种间竞争,使作物有更多的营养物质并得到更多的光照,进行松土可以减少杂草对水分、矿质元素和光的竞争增加土壤氧气含量,促进根系的呼吸作用。农田施肥浇水可以降低肥料浓度,避免肥料浓度高导致植物失水过多,影响正常生长,另外肥料中的矿质元素只有溶解在水中才能被作物根系吸收。(2)在农作物叶肉细胞中,光合色素分布在叶绿体类囊体薄膜上;参与CO<sub>2</sub>固定的化学物质是C<sub>5</sub>,C<sub>5</sub>和CO<sub>2</sub>生成C<sub>3</sub>,为暗反应过程的酶在叶绿体基质中。(3)从提高光能利用率的角度考虑,种间套作一般高矮植株套作,高的植物对光能要求高,矮的植株对光能要求低。表中分析可得,作物A光饱和点高且长得高,可利用上层光照进行光合作用;作物D光饱和点低且长得矮,与作物A间作后,能利用下层弱光进行光合作用,故最适合进行间作的两种作物是A和D。</span></div>
  115. </div>
  116. """
  117. hml3="""
  118. <div class="stem-wraper" data-v-35454a0f=""><span class="topic-number" data-v-35454a0f="">20.</span><span class="stem" data-v-35454a0f="">如图所示,竖直放置、导热良好的<span class="math-tex">\(U\)</span>形管内装有水银,右管封闭了一段长L=20cn<br>的空气柱,此时左、右两侧的水银面高度差为<span class="math-tex">\({h_{1}=13cm}\)</span>现从管的开口端慢慢倒入水银,最<br>终左管水银面比右管水银面高<span class="math-tex">\({h_{2}=8\quad cm}\)</span>,环境温度始终不变,外界大气压po=<br><span class="math-tex">\({76cmHg_{\circ }}\)</span>求:<br>(1)右管封闭空气柱的最终长度,<br>(2)加入的水银柱长度,<br>衡中]<br>同卷<br><img src="http://zxhx-1302712961.cos.ap-shanghai.myqcloud.com/imgpaper/lqy_upload/628d938481b582c0470d02eb/img_70.png" width="187" height="211"></span></div>
  119. <div class="topic-analysis" data-v-35454a0f="">
  120. <div class="topic-analysis-content" data-v-35454a0f=""><span class="analysis-prefix" data-v-35454a0f="">【答案】</span><span data-v-35454a0f="">B</span></div>
  121. <div class="topic-analysis-content" data-v-35454a0f=""><span class="analysis-prefix" data-v-35454a0f="">【解析】</span><span data-v-35454a0f="">15.解:(1)以封闭气体为研究对象,初态<br><span class="math-tex">\({j_{1}=b_{0}-ogh_{1}=63\quad cmHg,V_{1}=L}\)</span><br>末态<br><span class="math-tex">\({f_{2}=p_{0}+ogh_{2}=84cmg,V_{2}=L^{\prime },}\)</span><br>根据玻意耳定律<br><span class="math-tex">\({p_{1}V_{1}=p_{2}V_{2}}\)</span><br>解得<span class="math-tex">\({L^{\prime }=15cm}\)</span><br>(2)右管中水银柱增加的长度<br><span class="math-tex">\({x_{1}=L-L^{\prime }=5\cot1}\)</span><br>左管中水银柱增加的长度<br><span class="math-tex">\({r_{2}=h_{1}+h_{2}+(L-L^{\prime })=26c}\)</span><br>加入的水银柱长度<br><span class="math-tex">\({x=x_{1}+x_{2}=31cm}\)</span></span></div>
  122. </div>
  123. """
  124. hml4 = """
  125. <div class="stem-wraper" data-v-6e158526=""><span class="topic-number" data-v-6e158526="">5.</span><span class="stem" data-v-6e158526=""><span class="stem" data-v-6e158526="">解磷菌是土壤中的一类功能微生物,包括细菌、真菌和放线菌。筛选出土壤中的高效解磷菌并制成生物菌剂,可以提高难溶性磷的利用率。下表为“分离出土壤中具有解磷功能的微生物实验”的培养基配方,下列说法正确的是( )<br></span></span>
  126. <table>
  127. <tbody>
  128. <tr>
  129. <td>物质</td>
  130. <td>葡萄糖</td>
  131. <td>(NH<sub>4</sub>)<sub>2</sub>SO<sub>4</sub></td>
  132. <td>NaCl</td>
  133. <td>KCl</td>
  134. <td>CaCO<sub>3</sub></td>
  135. <td>磷酸三钙</td>
  136. <td>琼脂</td>
  137. </tr>
  138. <tr>
  139. <td>质量/g</td>
  140. <td>10</td>
  141. <td>0.5</td>
  142. <td>3</td>
  143. <td>0.3</td>
  144. <td>5</td>
  145. <td>20</td>
  146. <td>15</td>
  147. </tr>
  148. </tbody>
  149. </table>
  150. <span class="analysis-prefix" data-v-6e158526=""><br>A:</span><span data-v-6e158526="">培养基中加入琼脂的目的是作为凝固剂和提供碳源</span></div>
  151. <ul class="stem-options" data-v-6e158526="">
  152. <li data-v-6e158526=""><span class="analysis-prefix" data-v-6e158526="">B:</span><span data-v-6e158526="">该培养基是以磷酸三钙为唯一磷源的选择培养基</span></li>
  153. <li data-v-6e158526=""><span class="analysis-prefix" data-v-6e158526="">C:</span><span data-v-6e158526="">用平板划线法纯化解磷菌可以计数其活菌的数量</span></li>
  154. <li data-v-6e158526=""><span class="analysis-prefix" data-v-6e158526="">D:</span><span data-v-6e158526="">可根据培养基中透明圈的大小确定菌株的解磷能力</span></li>
  155. </ul>
  156. <div class="topic-analysis" data-v-6e158526="">
  157. <div class="topic-analysis-content" data-v-6e158526=""><span class="analysis-prefix" data-v-6e158526="">【答案】</span><span data-v-6e158526="">B</span></div>
  158. <div class="topic-analysis-content" data-v-6e158526=""><span class="analysis-prefix" data-v-6e158526="">【解析】</span><span data-v-6e158526="">【分析】1、微生物常见的接种的方法:(1)平板划线法:将已经熔化的培养基倒入培养皿制成平板,接种、划线,在恒温箱里培养,在线的开始部分,微生物往往连在一起生长,随着线的延伸,菌数逐渐减少,最后可能形成单个菌落。(2)稀释涂布平板法:将待分离的菌液经过大量稀释后,均匀涂布在培养皿表面,经培养后可形成单个菌落。<br>2、选择培养基:根据某种微生物的特殊营养要求或其对某化学、物理因素的抗性而设计的培养基使混合菌样中的劣势菌变成优势菌,从而提高该菌的筛选率,如加入青霉素分离得到酵母菌和霉菌。<br>【详解】A、配制固体培养基时可加入琼脂作为凝固剂,琼脂一般不会被微生物所利用,A错误;<br>B、本实验的目的是获得具有解磷功能的微生物,故其选择培养基中应以磷酸三钙为唯一磷源,B正确;<br>C、用稀释涂布平板法纯化解磷菌可以计数其活菌的数量,C错误;<br>D、可根据透明圈直径(D)与菌落直径(d)的比值(D/d)代表微生物解磷能力大小,D错误。<br>故选B。<br></span></div>
  159. </div>
  160. """
  161. aa = single_parse(hml4, "选择题", "456")
  162. pprint(aa)
  163. # tt = r"""
  164. # 25℃时,若测得HR溶液$\text{pH=a}$,取该溶液$\text{10}\text{.0mL}$,加蒸馏水稀释至$\text{100}\text{.0mL}$,测得$\text{pH=b,b-a<1}$,则HR是弱酸
  165. # """
  166. #
  167. # one_item = base642img(tt, "333333333")
  168. # one_item = css_conflict_deal(one_item)
  169. # print(one_item)