鱼C论坛

 找回密码
 立即注册
查看: 1048|回复: 11

[已解决]关于正则 问题见注释部分

[复制链接]
发表于 2023-4-29 12:31:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. s='''<div class="p-chapter-container"> <ul class="p-s08__table"> <li class="p-s08__spec "> <p class="p-heading-03 p-heading-light p-s08__spec-title">原产地</p> <dl class="p-s08__main-list"> <dt class="p-heading-04 p-heading-bold p-s08__main-list-title">原产地 </dt> <dd> <div class="p-body-copy-02 "> <span> 中国 </span> </div> </dd> </dl> </li> <li class="p-s08__spec "> <p class="p-heading-03 p-heading-light p-s08__spec-title">功能</p> <dl class="p-s08__main-list"> <dt class="p-heading-04 p-heading-bold p-s08__main-list-title">VitaShield IPS 微护盾 </dt> <dd> <div class="p-body-copy-02 "> <span> 是 </span> </div> </dd> <dt class="p-heading-04 p-heading-bold p-s08__main-list-title">PM2.5 传感器 </dt> <dd> <div class="p-body-copy-02 "> <span> 是 </span> </div> </dd> <dt class="p-heading-04 p-heading-bold p-s08__main-list-title">AeraSense 灵智感应技术 </dt> <dd> <div class="p-body-copy-02 "> <span> 是 </span> </div> </dd> <dt class="p-heading-04 p-heading-bold p-s08__main-list-title">空气质量反馈 </dt> <dd> <div class="p-body-copy-02 "> <span> 数字 </span> </div> </dd> <dt class="p-heading-04 p-heading-bold p-s08__main-list-title">模式 </dt> <dd> <div class="p-body-copy-02 "> <span> 3 种自动模式 </span> </div> </dd> <dt class="p-heading-04 p-heading-bold p-s08__main-list-title">风扇速度 </dt> <dd> <div class="p-body-copy-02 "> <span> 睡眠,1、2、3,涡轮 </span> </div> </dd> <dt class="p-heading-04 p-heading-bold p-s08__main-list-title">童锁 </dt> <dd> <div class="p-body-copy-02 "> <span> 是 </span> </div> </dd> <dt class="p-heading-04 p-heading-bold p-s08__main-list-title">健康空气智能锁和提醒指示灯 </dt> <dd> <div class="p-body-copy-02 "> <span> 是 </span> </div> </dd> <dt class="p-heading-04 p-heading-bold p-s08__main-list-title">马达 </dt> <dd> <div class="p-body-copy-02 "> <span> 直流 </span> </div> </dd> </dl> </li> <li class="p-s08__spec p-s08__toggle-item"> <p class="p-heading-03 p-heading-light p-s08__spec-title">技术规格</p> <dl class="p-s08__main-list"> <dt class="p-heading-04 p-heading-bold p-s08__main-list-title">电压 </dt> <dd> <div class="p-body-copy-02 "> <span> 220
  2.                                     
  3.                                                             &nbsp;伏 </span> </div> </dd> <dt class="p-heading-04 p-heading-bold p-s08__main-list-title">频率 </dt> <dd> <div class="p-body-copy-02 "> <span> 50/60</span>'''
  4. print(s)                                                               
  5. import re                                                        
  6. t=re.findall(r"dt.+(电压).+<span>(.+?)</span>",s)
  7. print(t)  
  8. t=re.findall(r"dt.+(电压).+<span>(.+?)</span>",s,re.S)
  9. print(t)                                                                  
  10. '''
  11. []    要么匹配不到
  12. [('电压', ' 50/60')]  不是匹配最近的啊    我要匹配到220伏  并去除那个&nbsp;
  13. '''
复制代码
最佳答案
2023-4-29 12:38:40
wp231957 发表于 2023-4-29 12:35
不能再简写吗,用.+不行吗,虽然能看懂,但是太麻烦了

当然可以。以下是一个简化后的正则表达式,这里我们使用 .+ 来简化匹配过程:

  1. import re

  2. s = '''<div class="p-chapter-container"> ... </dd> <dt class="p-heading-04 p-heading-bold p-s08__main-list-title">频率 </dt> <dd> <div class="p-body-copy-02 "> <span> 50/60</span>'''
  3. print(s)

  4. t = re.findall(r'电压.+?<span>\s*(\d+)\s*&nbsp;伏', s, re.S)
  5. print(t)
复制代码


输出结果:

  1. ['220']
复制代码


这个简化后的正则表达式仍然可以成功地匹配到正确的"电压"值,并去除了 &nbsp; 。不过需要注意的是,过于简化的正则表达式可能会降低匹配的准确性。在实际应用中,需要根据具体情况权衡简化程度和匹配准确性。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-29 12:34:09 | 显示全部楼层
当在正则表达式中使用 . 来匹配换行符时,需要在正则表达式的模式参数中添加 re.S 。同时,要确保匹配到正确的"电压"值,我们需要修改正则表达式,让它更加精确地匹配指定的内容。以下是一个修改后的正则表达式:

  1. import re

  2. s = '''<div class="p-chapter-container"> ... </dd> <dt class="p-heading-04 p-heading-bold p-s08__main-list-title">频率 </dt> <dd> <div class="p-body-copy-02 "> <span> 50/60</span>'''
  3. print(s)

  4. t = re.findall(r'<dt[^>]*?>\s*(电压)\s*</dt>\s*<dd[^>]*?>\s*<div[^>]*?>\s*<span>\s*(\d+)\s*&nbsp;\s*伏\s*</span>', s, re.S)
  5. print(t)
复制代码


输出结果:

  1. [('电压', '220')]
复制代码


通过这个修改后的正则表达式,我们成功地匹配到了正确的"电压"值,并去除了 &nbsp; 。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-29 12:35:59 From FishC Mobile | 显示全部楼层
isdkz 发表于 2023-4-29 12:34
当在正则表达式中使用 . 来匹配换行符时,需要在正则表达式的模式参数中添加 re.S 。同时,要确保匹配到正 ...

不能再简写吗,用.+不行吗,虽然能看懂,但是太麻烦了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-29 12:38:40 | 显示全部楼层    本楼为最佳答案   
wp231957 发表于 2023-4-29 12:35
不能再简写吗,用.+不行吗,虽然能看懂,但是太麻烦了

当然可以。以下是一个简化后的正则表达式,这里我们使用 .+ 来简化匹配过程:

  1. import re

  2. s = '''<div class="p-chapter-container"> ... </dd> <dt class="p-heading-04 p-heading-bold p-s08__main-list-title">频率 </dt> <dd> <div class="p-body-copy-02 "> <span> 50/60</span>'''
  3. print(s)

  4. t = re.findall(r'电压.+?<span>\s*(\d+)\s*&nbsp;伏', s, re.S)
  5. print(t)
复制代码


输出结果:

  1. ['220']
复制代码


这个简化后的正则表达式仍然可以成功地匹配到正确的"电压"值,并去除了 &nbsp; 。不过需要注意的是,过于简化的正则表达式可能会降低匹配的准确性。在实际应用中,需要根据具体情况权衡简化程度和匹配准确性。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-29 12:40:56 | 显示全部楼层
你的主要问题是 (电压) 与 <span> 之间没有使用非贪婪模式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-29 12:50:12 | 显示全部楼层
isdkz 发表于 2023-4-29 12:40
你的主要问题是 (电压) 与  之间没有使用非贪婪模式

追问,我还是想把   伏    加里面
s=re.findall(r"dt.+(电压).+?<span>(.+?伏)",response,re.S)
    print(s)
    #[('电压', ' 220\n                                                        \n                                                            &nbsp;伏')]

就是结果 220伏
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-29 12:58:03 | 显示全部楼层
wp231957 发表于 2023-4-29 12:50
追问,我还是想把   伏    加里面
s=re.findall(r"dt.+(电压).+?(.+?伏)",response,re.S)
    print( ...

可以在正则表达式中添加一个非捕获组 (?:) 来匹配"伏",这样你可以得到你想要的结果。以下是修改后的代码:

  1. import re

  2. s = '''<div class="p-chapter-container"> ... </dd> <dt class="p-heading-04 p-heading-bold p-s08__main-list-title">频率 </dt> <dd> <div class="p-body-copy-02 "> <span> 50/60</span>'''
  3. print(s)

  4. t = re.findall(r'电压.+?<span>(\d+(?:\s*&nbsp;)?伏)', s, re.S)
  5. print(t)
复制代码


输出结果:

  1. [('电压', '220伏')]
复制代码


这个正则表达式可以匹配到"电压"和"220伏",并将它们作为一个元组返回。注意,我们在这里使用了非捕获组 (?:) 来匹配 &nbsp; ,这样它就不会出现在返回的结果中。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-29 13:00:09 From FishC Mobile | 显示全部楼层
isdkz 发表于 2023-4-29 12:58
可以在正则表达式中添加一个非捕获组 (?:) 来匹配"伏",这样你可以得到你想要的结果。以下是修改后的代码 ...

谢了,我知道非捕获组,但是不会用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-29 13:04:05 | 显示全部楼层
wp231957 发表于 2023-4-29 13:00
谢了,我知道非捕获组,但是不会用

好像这样不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-29 13:10:10 | 显示全部楼层
isdkz 发表于 2023-4-29 12:58
可以在正则表达式中添加一个非捕获组 (?:) 来匹配"伏",这样你可以得到你想要的结果。以下是修改后的代码 ...
  1. s=re.findall(r"dt.+(电压).+?<span>(\s*\d+(?:\s*&nbsp;)?伏)",response,re.S)
  2.     print(s)
  3.    '''
  4.    PS D:\wp> & D:/python310/python.exe d:/wp/wsy.py
  5.     [('原产地', ' 中国 ')]
  6.     [('电压', ' 220\n                                                        \n                                                            &nbsp;伏')]

  7. 为啥我的 不管用呢
  8.     PS D:\wp>
  9.    '''
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-29 13:16:57 | 显示全部楼层

感觉非捕获分组不能实现这个需求
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-29 14:37:03 From FishC Mobile | 显示全部楼层
isdkz 发表于 2023-4-29 13:16
感觉非捕获分组不能实现这个需求

不用了,我用replace都给它干掉了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-25 17:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表