heiyahua 发表于 2023-3-23 19:48

正则表达式求指教

本帖最后由 heiyahua 于 2023-3-24 10:28 编辑

                              <div class="question-type-item" data-dynamic-key="2e77701f-3ea4-45c2-8a51-58458894b0fc" data-current="exam/exam/question/types/answer/choise"><div class="choise preview-content">
    <div data-region="content" data-current="exam/exam/question/types/answer/choise:content">
    <div class="question">
      <span><a class="normal" name="question-2e77701f-3ea4-45c2-8a51-58458894b0fc">1、</a></span>
      查看Linux系统的磁盘列表,并以K或G字节为单位显示磁盘容量的指令是:
    </div>

</div>
    <div class="options" data-region="options" data-current="exam/exam/question/types/answer/choise:options">
<div class="answer">
    <div class="preview-list"><dl>
      <dd id="D86094item-0">
                <div class="radio m-right">
                  <input type="radio" name="value-2e77701f-3ea4-45c2-8a51-58458894b0fc" id="D86094radio-0" value="0">
                  <label for="D86094radio-0"></label>
                </div>
            <label for="D86094answer-item-0">
                <span class="pull-left option-num">A.</span>
                <div class="answer-options m-left">df -l</div>
            </label>
      </dd>

      <dd id="D86094item-1">
                <div class="radio m-right">
                  <input type="radio" name="value-2e77701f-3ea4-45c2-8a51-58458894b0fc" id="D86094radio-1" value="1">
                  <label for="D86094radio-1"></label>
                </div>
            <label for="D86094answer-item-1">
                <span class="pull-left option-num">B.</span>
                <div class="answer-options m-left">du -s</div>
            </label>
      </dd>

      <dd id="D86094item-2">
                <div class="radio m-right">
                  <input checked="checked" type="radio" name="value-2e77701f-3ea4-45c2-8a51-58458894b0fc" id="D86094radio-2" value="2">
                  <label for="D86094radio-2"></label>
                </div>
            <label for="D86094answer-item-2">
                <span class="pull-left option-num">C.</span>
                <div class="answer-options m-left">df -i</div>
            </label>
      </dd>

      <dd id="D86094item-3">
                <div class="radio m-right">
                  <input type="radio" name="value-2e77701f-3ea4-45c2-8a51-58458894b0fc" id="D86094radio-3" value="3">
                  <label for="D86094radio-3"></label>
                </div>
            <label for="D86094answer-item-3">
                <span class="pull-left option-num">D.</span>
                <div class="answer-options m-left">df -h</div>
            </label>
      </dd>
    </dl></div>
</div>
</div>
</div>

</div>
                        <div data-dynamic-key="correct-6f719e0e-74fe-44d8-a383-1922d04dc1a0" data-current="exam/exam/answer-paper/waiting-check-correct">    <div data-region="main" data-current="exam/exam/answer-paper/waiting-check-correct:main">    <div class="bottom-favorite">
      <div class="item ">
            <i class="iconfont icon-mark"></i>
            <span><a id="D86095waiting-check-6f719e0e-74fe-44d8-a383-1922d04dc1a0">待检查</a></span>
      </div>
    </div>
</div>
</div>
                            <div class="question-type-item" data-dynamic-key="6f719e0e-74fe-44d8-a383-1922d04dc1a0" data-current="exam/exam/question/types/answer/choise"><div class="choise preview-content">
    <div data-region="content" data-current="exam/exam/question/types/answer/choise:content">
    <div class="question">
      <span><a class="normal" name="question-6f719e0e-74fe-44d8-a383-1922d04dc1a0">2、</a></span>
      包含MAC地址/UUID/WWN号刀片的服务器配置定制化策略可以
    </div>

</div>
    <div class="options" data-region="options" data-current="exam/exam/question/types/answer/choise:options">
<div class="answer">
    <div class="preview-list"><dl>
      <dd id="D86097item-0">
                <div class="radio m-right">
                  <input checked="checked" type="radio" name="value-6f719e0e-74fe-44d8-a383-1922d04dc1a0" id="D86097radio-0" value="0">
                  <label for="D86097radio-0"></label>
                </div>
            <label for="D86097answer-item-0">
                <span class="pull-left option-num">A.</span>
                <div class="answer-options m-left">绑定两台服务器做主备服务器</div>
            </label>
      </dd>

      <dd id="D86097item-1">
                <div class="radio m-right">
                  <input type="radio" name="value-6f719e0e-74fe-44d8-a383-1922d04dc1a0" id="D86097radio-1" value="1">
                  <label for="D86097radio-1"></label>
                </div>
            <label for="D86097answer-item-1">
                <span class="pull-left option-num">B.</span>
                <div class="answer-options m-left">绑定一台服务器</div>
            </label>
      </dd>

      <dd id="D86097item-2">
                <div class="radio m-right">
                  <input type="radio" name="value-6f719e0e-74fe-44d8-a383-1922d04dc1a0" id="D86097radio-2" value="2">
                  <label for="D86097radio-2"></label>
                </div>
            <label for="D86097answer-item-2">
                <span class="pull-left option-num">C.</span>
                <div class="answer-options m-left">多台服务器计算节点</div>
            </label>
      </dd>
    </dl></div>
</div>
</div>
</div>

</div>
                        <div data-dynamic-key="correct-9bd5c818-fdf0-4bd6-9d51-2614a29f119f" data-current="exam/exam/answer-paper/waiting-check-correct">    <div data-region="main" data-current="exam/exam/answer-paper/waiting-check-correct:main">    <div class="bottom-favorite">
      <div class="item ">
            <i class="iconfont icon-mark"></i>
            <span><a id="D86098waiting-check-9bd5c818-fdf0-4bd6-9d51-2614a29f119f">待检查</a></span>
      </div>
    </div>
</div></div>


上边的是源码,选择题第一题有ABCD四个选项,第二题有ABC三个选项,其余题目可能会有ABCDEF五个选项,我想把题目和选项都匹配出来,请教正则表达式需要如何修改?之前使用(?:和)?仍然没有效果
partten_timu = f'<span><a class="normal" name="{list_bianma}">({list_xuhao})、</a></span>\s      (.*?)\s    </div>\s\s</div>\s    <div.+?<span class="pull-left option-num">(A).</span>\s' \
                   f'                <div class="answer-options m-left">(.*?)</div.+?                <span class="pull-left option-num">(B).</span>\s                <div class="answer-options m-left">(.*?)</div.+?' \
                   f'                <span class="pull-left option-num">(C).</span>\s                <div class="answer-options m-left">(.*?)</div.+?' \
                   f'                <span class="pull-left option-num">(D).</span>\s                <div class="answer-options m-left">(.*?)</div.+?' \
                   f'                <span class="pull-left option-num">(E).</span>\s                <div class="answer-options m-left">(.*?)</div.+?' \
                   f'                <span class="pull-left option-num">(F).</span>\s                <div class="answer-options m-left">(.*?)</div'

正则表达式需要把选择题的ABCD选项匹配出来,但是有个别题目会有EF选项。上边的正则表达式去掉最后两行后可以运行但是会缺少部分选项,加上最后两行之后又无法匹配全部题目,求教应该怎么修改?

han5562877 发表于 2023-3-23 22:47

本帖最后由 han5562877 于 2023-3-23 22:52 编辑

使用正则表达式的可选分组,应该改为这样
```python
partten_timu = f'<span><a class="normal" name="{list_bianma}">({list_xuhao})、</a></span>\s      (.*?)\s    </div>\s\s</div>\s    <div.+?<span class="pull-left option-num">(A).</span>\s' \
               f'                <div class="answer-options m-left">(.*?)</div.+?                <span class="pull-left option-num">(B).</span>\s                <div class="answer-options m-left">(.*?)</div.+?' \
               f'                <span class="pull-left option-num">(C).</span>\s                <div class="answer-options m-left">(.*?)</div.+?' \
               f'                <span class="pull-left option-num">(D).</span>\s                <div class="answer-options m-left">(.*?)</div.+?' \
               f'(?:             <span class="pull-left option-num">(E).</span>\s                <div class="answer-options m-left">(.*?)</div.+?)?' \
               f'(?:             <span class="pull-left option-num">(F).</span>\s                <div class="answer-options m-left">(.*?)</div)?'
```
分组前面加上了(?:和)?用来变成可选

tl;dr 发表于 2023-3-24 07:09

jetty1986 发表于 2023-3-24 07:54

好久不弄了,有点生疏了{:1_889:}

fengrui99 发表于 2023-3-24 08:24

学习一下

小屎球 发表于 2023-3-24 08:37

如果是爬虫建议用xpath,如果是模板渲染建议用for循环

zdnyp 发表于 2023-3-24 09:33

你能把问题提好不{:1_925:}你甚至不贴源代码

c13950143096 发表于 2023-3-24 09:36

r'<div class="answer-options m-left">\s+(.*?)\s+</div>'
该正则表达式主要作用是匹配包含选项(abcdef)的 <div> 标签,并且通过捕获组 (.*?) 来获取选项文本。其中 \s+ 表示匹配一个或多个空白字符, (.*?) 表示匹配任意字符(包括换行符),非贪婪模式,直到遇到下一个表达式。使用该正则表达式可以方便地获取题目选项。

Ta'ta 发表于 2023-3-24 09:54

有正则表达式测试的软件,自己慢慢试一下用哪个表达式,好久没用我都忘记了

bobo2017365 发表于 2023-3-24 10:11

那就分几步走呗,第一步提取所有答案,分别存放到字符串,第二步拼接这些字符串
页: [1]
查看完整版本: 正则表达式求指教