wp231957 发表于 2023-4-29 12:31:54

关于正则 问题见注释部分

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
                                    
                                                            &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>'''
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伏并去除那个&nbsp;
'''

isdkz 发表于 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*&nbsp;\s*伏\s*</span>', s, re.S)
print(t)


输出结果:

[('电压', '220')]


通过这个修改后的正则表达式,我们成功地匹配到了正确的"电压"值,并去除了 &nbsp; 。

wp231957 发表于 2023-4-29 12:35:59

isdkz 发表于 2023-4-29 12:34
当在正则表达式中使用 . 来匹配换行符时,需要在正则表达式的模式参数中添加 re.S 。同时,要确保匹配到正 ...

不能再简写吗,用.+不行吗,虽然能看懂,但是太麻烦了

isdkz 发表于 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*&nbsp;伏', s, re.S)
print(t)


输出结果:

['220']


这个简化后的正则表达式仍然可以成功地匹配到正确的"电压"值,并去除了 &nbsp; 。不过需要注意的是,过于简化的正则表达式可能会降低匹配的准确性。在实际应用中,需要根据具体情况权衡简化程度和匹配准确性。

isdkz 发表于 2023-4-29 12:40:56

你的主要问题是 (电压) 与 <span> 之间没有使用非贪婪模式

wp231957 发表于 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伏

isdkz 发表于 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*&nbsp;)?伏)', s, re.S)
print(t)


输出结果:

[('电压', '220伏')]


这个正则表达式可以匹配到"电压"和"220伏",并将它们作为一个元组返回。注意,我们在这里使用了非捕获组 (?:) 来匹配 &nbsp; ,这样它就不会出现在返回的结果中。

wp231957 发表于 2023-4-29 13:00:09

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

谢了,我知道非捕获组,但是不会用

isdkz 发表于 2023-4-29 13:04:05

wp231957 发表于 2023-4-29 13:00
谢了,我知道非捕获组,但是不会用

好像这样不行{:10_277:}

wp231957 发表于 2023-4-29 13:10:10

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

s=re.findall(r"dt.+(电压).+?<span>(\s*\d+(?:\s*&nbsp;)?伏)",response,re.S)
    print(s)
   '''
   PS D:\wp> & D:/python310/python.exe d:/wp/wsy.py
    [('原产地', ' 中国 ')]
    [('电压', ' 220\n                                                      \n                                                            &nbsp;伏')]

为啥我的 不管用呢
    PS D:\wp>
   '''

isdkz 发表于 2023-4-29 13:16:57

wp231957 发表于 2023-4-29 13:10


感觉非捕获分组不能实现这个需求{:10_277:}

wp231957 发表于 2023-4-29 14:37:03

isdkz 发表于 2023-4-29 13:16
感觉非捕获分组不能实现这个需求

不用了,我用replace都给它干掉了
页: [1]
查看完整版本: 关于正则 问题见注释部分