鱼C论坛

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

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

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

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

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

x
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
                                    
                                                             伏 </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>'''
print(s)                                                                
import re                                                        
t=re.findall(r"dt.+(电压).+<span>(.+?)</span>",s) 
print(t)  
t=re.findall(r"dt.+(电压).+<span>(.+?)</span>",s,re.S) 
print(t)                                                                   
'''
[]    要么匹配不到
[('电压', ' 50/60')]  不是匹配最近的啊    我要匹配到220伏  并去除那个 
 '''
最佳答案
2023-4-29 12:38:40
wp231957 发表于 2023-4-29 12:35
不能再简写吗,用.+不行吗,虽然能看懂,但是太麻烦了

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

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>'''
print(s)

t = re.findall(r'电压.+?<span>\s*(\d+)\s* 伏', s, re.S)
print(t)

输出结果:
['220']

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

使用道具 举报

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

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>'''
print(s)

t = re.findall(r'<dt[^>]*?>\s*(电压)\s*</dt>\s*<dd[^>]*?>\s*<div[^>]*?>\s*<span>\s*(\d+)\s* \s*伏\s*</span>', s, re.S)
print(t)

输出结果:
[('电压', '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
不能再简写吗,用.+不行吗,虽然能看懂,但是太麻烦了

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

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>'''
print(s)

t = re.findall(r'电压.+?<span>\s*(\d+)\s* 伏', s, re.S)
print(t)

输出结果:
['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( ...

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

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>'''
print(s)

t = re.findall(r'电压.+?<span>(\d+(?:\s* )?伏)', s, re.S)
print(t)

输出结果:
[('电压', '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
可以在正则表达式中添加一个非捕获组 (?:) 来匹配"伏",这样你可以得到你想要的结果。以下是修改后的代码 ...
 s=re.findall(r"dt.+(电压).+?<span>(\s*\d+(?:\s* )?伏)",response,re.S) 
    print(s)
   '''
   PS D:\wp> & D:/python310/python.exe d:/wp/wsy.py
    [('原产地', ' 中国 ')]
    [('电压', ' 220\n                                                        \n                                                             伏')]

为啥我的 不管用呢
    PS D:\wp> 
   '''
想知道小甲鱼最近在做啥?请访问 -> 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-9-23 11:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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