leouliu 发表于 2020-4-28 09:14:54

求教一个正则表达式的解读

r = requests.get('http://money.cnn.com/data/dow30/')
    search_pattern = re.compile('class="wsod_symbol">(.*?)<\/a>.*?<span.*?">(.*?)<\/span>.*?\n.*?class="wsod_stream">(.*?)<\/span>')

悠悠2264 发表于 2020-4-28 09:33:56

.表示任意一个字符(除换行符),*表示匹配前面的子表达式(也就是前面的.)0次或多次,也就相当于匹配一个字符串,?跟在.*后面则表示开启非贪婪模式。
非贪婪模式也就是匹配最少的字符,比如正则表达式:a.*?c,字符串是:abcdcba,匹配的就会是abc,而贪婪模式(去掉?)就是abcdc。

AINIDEREN 发表于 2020-4-28 09:34:10

compile方法是编译正则表达式,(.*?)这里每一个括号都是一个组,点表示匹配任意字符,但是不包括换行符,*表示匹配前一个字符0次或多次。?是非贪婪模式
用编译后的search_pattern调用search,findall等方法例子 result = search_pattern.findall(r.text)   result返回的是一个列表类型其中多个组以元祖类型打包

leouliu 发表于 2020-4-28 09:47:29

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

这些单个拆开的意思我理解,但是整句正则式的意思什么,我有点看不懂。

leouliu 发表于 2020-4-28 09:48:10

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

请能麻烦,翻一下整条正则式的意思吗?

悠悠2264 发表于 2020-4-28 09:55:50

class="wsod_symbol">字符串<\/a>字符串<span字符串">字符串<\/span>字符串\n字符串class="wsod_stream">字符串<\/span>
像以上作业就会被匹配,.*?就是匹配尽可能少的字符串,如果不开非贪婪模式则会从第一个class匹配到最后一个<\/span>。

leouliu 发表于 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>&nbsp;<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>

怎么就读取了 MMM3M 160.09
上述正则表达式,我只用前面这部分时,class="wsod_symbol">字符串<\/a>它只获取第一个字母,这又是怎么回事呢?

悠悠2264 发表于 2020-4-28 11:19:45

该正则表达式匹配到的字符串是:
class="wsod_symbol">MMM</a>&nbsp;<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>

AINIDEREN 发表于 2020-4-28 12:04:48

leouliu 发表于 2020-4-28 09:47
这些单个拆开的意思我理解,但是整句正则式的意思什么,我有点看不懂。

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

leouliu 发表于 2020-4-28 13:53:01

悠悠2264 发表于 2020-4-28 11:19
该正则表达式匹配到的字符串是:

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


最后取到的值只有3个,MMM,3M,160.09,等于带括号才是最后的获取对象?

leouliu 发表于 2020-4-28 13:53:56

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

你这样解释,我似乎明白了。
页: [1]
查看完整版本: 求教一个正则表达式的解读