鱼C论坛

 找回密码
 立即注册
查看: 1184|回复: 10

[已解决]求教一个正则表达式的解读

[复制链接]
发表于 2020-4-28 09:14:54 | 显示全部楼层 |阅读模式

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

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

x
r = requests.get('http://money.cnn.com/data/dow30/')
    search_pattern = re.compile('class="wsod_symbol">(.*?)<\/a>.*?<span.*?">(.*?)<\/span>.*?\n.*?class="wsod_stream">(.*?)<\/span>')
最佳答案
2020-4-28 12:04:48
leouliu 发表于 2020-4-28 09:47
这些单个拆开的意思我理解,但是整句正则式的意思什么,我有点看不懂。

整句就是除了元字符其他字符都是匹配本身,我给你拆开一部分说一说class="wsod_symbol">这个部分作用就是匹配本身字符,起到一个定位作用。凡是包含class="wsod_symbol">这样的字符都会匹配。而其他没有被括号所包含的.*?就是元字符,他匹配的内容就是>.*?<之间的内容  例子>abcdefg<,通配符就是>.*?<    所以说整句看起来复杂,而实际就是把想要 的内容扩起来,其他的定位字符就是非元字符本身。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-28 09:33:56 | 显示全部楼层
.表示任意一个字符(除换行符),*表示匹配前面的子表达式(也就是前面的.)0次或多次,也就相当于匹配一个字符串,?跟在.*后面则表示开启非贪婪模式。
非贪婪模式也就是匹配最少的字符,比如正则表达式:a.*?c,字符串是:abcdcba,匹配的就会是abc,而贪婪模式(去掉?)就是abcdc。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-28 09:34:10 | 显示全部楼层
compile方法是编译正则表达式,(.*?)这里每一个括号都是一个组,点表示匹配任意字符,但是不包括换行符,*表示匹配前一个字符0次或多次。?是非贪婪模式
用编译后的search_pattern调用search,findall等方法例子 result = search_pattern.findall(r.text)   result返回的是一个列表类型其中多个组以元祖类型打包
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-28 09:47:29 | 显示全部楼层
AINIDEREN 发表于 2020-4-28 09:34
compile方法是编译正则表达式,(.*?)这里每一个括号都是一个组,点表示匹配任意字符,但是不包括换行符,* ...

这些单个拆开的意思我理解,但是整句正则式的意思什么,我有点看不懂。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-28 09:48:10 | 显示全部楼层
悠悠2264 发表于 2020-4-28 09:33
.表示任意一个字符(除换行符),*表示匹配前面的子表达式(也就是前面的.)0次或多次,也就相当于匹配一个 ...

请能麻烦,翻一下整条正则式的意思吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-28 09:55:50 | 显示全部楼层
class="wsod_symbol">字符串<\/a>字符串<span字符串">字符串<\/span>字符串\n字符串class="wsod_stream">字符串<\/span>
像以上作业就会被匹配,.*?就是匹配尽可能少的字符串,如果不开非贪婪模式则会从第一个class匹配到最后一个<\/span>。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-28 10:57:22 | 显示全部楼层
悠悠2264 发表于 2020-4-28 09:55
class="wsod_symbol">字符串字符串

这是页面部分页面代码
        <tr>
                <td class="wsod_firstCol"><a href="/quote/quote.html?symb=MMM" class="wsod_symbol">MMM</a> <span title="3M">3M</span></td>
                <td class="wsod_aRight"><span stream="last_202757" class="wsod_stream">160.09</span></td>
                <td class="wsod_aRight"><span stream="change_202757" class="wsod_stream"><span class="negData">-2.24</span></span></td>
                <td class="wsod_aRight"><span stream="changePct_202757" class="wsod_stream"><span class="negChangePct">-1.38%</span></span></td>
                <td class="wsod_aRight">2,143,772</td>
                <td class="wsod_aRight"><span class="negData">-9.26%</span></td>
        </tr>

怎么就读取了 MMM  3M 160.09
上述正则表达式,我只用前面这部分时,
class="wsod_symbol">字符串<\/a>
它只获取第一个字母,这又是怎么回事呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-28 11:19:45 | 显示全部楼层
该正则表达式匹配到的字符串是:
class="wsod_symbol">MMM</a> <span title="3M">3M</span></td>\n                <td class="wsod_aRight"><span stream="last_202757" class="wsod_stream">160.09</span>
他是这么匹配的:(黄色代表固定的,紫色代表.*?的内容)
class="wsod_symbol">MMM</a> <span title="3M">3M</span></td>\n                <td class="wsod_aRight"><span stream="last_202757" class="wsod_stream">160.09</span>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-28 12:04:48 | 显示全部楼层    本楼为最佳答案   
leouliu 发表于 2020-4-28 09:47
这些单个拆开的意思我理解,但是整句正则式的意思什么,我有点看不懂。

整句就是除了元字符其他字符都是匹配本身,我给你拆开一部分说一说class="wsod_symbol">这个部分作用就是匹配本身字符,起到一个定位作用。凡是包含class="wsod_symbol">这样的字符都会匹配。而其他没有被括号所包含的.*?就是元字符,他匹配的内容就是>.*?<之间的内容  例子>abcdefg<,通配符就是>.*?<    所以说整句看起来复杂,而实际就是把想要 的内容扩起来,其他的定位字符就是非元字符本身。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-28 13:53:01 | 显示全部楼层
悠悠2264 发表于 2020-4-28 11:19
该正则表达式匹配到的字符串是:

他是这么匹配的:(黄色代表固定的,紫色代表.*?的内容)

最后取到的值只有3个,MMM,3M,160.09,等于带括号才是最后的获取对象?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-28 13:53:56 | 显示全部楼层
AINIDEREN 发表于 2020-4-28 12:04
整句就是除了元字符其他字符都是匹配本身,我给你拆开一部分说一说class="wsod_symbol">这个部分作用就是 ...

你这样解释,我似乎明白了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 22:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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