关于正则 问题见注释部分
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伏并去除那个
''' 当在正则表达式中使用 . 来匹配换行符时,需要在正则表达式的模式参数中添加 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')]
通过这个修改后的正则表达式,我们成功地匹配到了正确的"电压"值,并去除了 。 isdkz 发表于 2023-4-29 12:34
当在正则表达式中使用 . 来匹配换行符时,需要在正则表达式的模式参数中添加 re.S 。同时,要确保匹配到正 ...
不能再简写吗,用.+不行吗,虽然能看懂,但是太麻烦了 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']
这个简化后的正则表达式仍然可以成功地匹配到正确的"电压"值,并去除了 。不过需要注意的是,过于简化的正则表达式可能会降低匹配的准确性。在实际应用中,需要根据具体情况权衡简化程度和匹配准确性。 你的主要问题是 (电压) 与 <span> 之间没有使用非贪婪模式 isdkz 发表于 2023-4-29 12:40
你的主要问题是 (电压) 与之间没有使用非贪婪模式
追问,我还是想把 伏 加里面
s=re.findall(r"dt.+(电压).+?<span>(.+?伏)",response,re.S)
print(s)
#[('电压', ' 220\n \n 伏')]
就是结果 220伏 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伏",并将它们作为一个元组返回。注意,我们在这里使用了非捕获组 (?:) 来匹配 ,这样它就不会出现在返回的结果中。 isdkz 发表于 2023-4-29 12:58
可以在正则表达式中添加一个非捕获组 (?:) 来匹配"伏",这样你可以得到你想要的结果。以下是修改后的代码 ...
谢了,我知道非捕获组,但是不会用 wp231957 发表于 2023-4-29 13:00
谢了,我知道非捕获组,但是不会用
好像这样不行{:10_277:} 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>
''' wp231957 发表于 2023-4-29 13:10
感觉非捕获分组不能实现这个需求{:10_277:} isdkz 发表于 2023-4-29 13:16
感觉非捕获分组不能实现这个需求
不用了,我用replace都给它干掉了
页:
[1]