求教一个正则表达式的解读
r = requests.get('http://money.cnn.com/data/dow30/')search_pattern = re.compile('class="wsod_symbol">(.*?)<\/a>.*?<span.*?">(.*?)<\/span>.*?\n.*?class="wsod_stream">(.*?)<\/span>') .表示任意一个字符(除换行符),*表示匹配前面的子表达式(也就是前面的.)0次或多次,也就相当于匹配一个字符串,?跟在.*后面则表示开启非贪婪模式。
非贪婪模式也就是匹配最少的字符,比如正则表达式:a.*?c,字符串是:abcdcba,匹配的就会是abc,而贪婪模式(去掉?)就是abcdc。 compile方法是编译正则表达式,(.*?)这里每一个括号都是一个组,点表示匹配任意字符,但是不包括换行符,*表示匹配前一个字符0次或多次。?是非贪婪模式
用编译后的search_pattern调用search,findall等方法例子 result = search_pattern.findall(r.text) result返回的是一个列表类型其中多个组以元祖类型打包 AINIDEREN 发表于 2020-4-28 09:34
compile方法是编译正则表达式,(.*?)这里每一个括号都是一个组,点表示匹配任意字符,但是不包括换行符,* ...
这些单个拆开的意思我理解,但是整句正则式的意思什么,我有点看不懂。 悠悠2264 发表于 2020-4-28 09:33
.表示任意一个字符(除换行符),*表示匹配前面的子表达式(也就是前面的.)0次或多次,也就相当于匹配一个 ...
请能麻烦,翻一下整条正则式的意思吗? class="wsod_symbol">字符串<\/a>字符串<span字符串">字符串<\/span>字符串\n字符串class="wsod_stream">字符串<\/span>
像以上作业就会被匹配,.*?就是匹配尽可能少的字符串,如果不开非贪婪模式则会从第一个class匹配到最后一个<\/span>。 悠悠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>
怎么就读取了 MMM3M 160.09
上述正则表达式,我只用前面这部分时,class="wsod_symbol">字符串<\/a>它只获取第一个字母,这又是怎么回事呢? 该正则表达式匹配到的字符串是:
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> leouliu 发表于 2020-4-28 09:47
这些单个拆开的意思我理解,但是整句正则式的意思什么,我有点看不懂。
整句就是除了元字符其他字符都是匹配本身,我给你拆开一部分说一说class="wsod_symbol">这个部分作用就是匹配本身字符,起到一个定位作用。凡是包含class="wsod_symbol">这样的字符都会匹配。而其他没有被括号所包含的.*?就是元字符,他匹配的内容就是>.*?<之间的内容例子>abcdefg<,通配符就是>.*?< 所以说整句看起来复杂,而实际就是把想要 的内容扩起来,其他的定位字符就是非元字符本身。 悠悠2264 发表于 2020-4-28 11:19
该正则表达式匹配到的字符串是:
他是这么匹配的:(黄色代表固定的,紫色代表.*?的内容)
最后取到的值只有3个,MMM,3M,160.09,等于带括号才是最后的获取对象? AINIDEREN 发表于 2020-4-28 12:04
整句就是除了元字符其他字符都是匹配本身,我给你拆开一部分说一说class="wsod_symbol">这个部分作用就是 ...
你这样解释,我似乎明白了。
页:
[1]