Python新手学习正则表达式时碰到的一个问题

python 版本 3.6.5,代码如下:

import requests

import re

content = requests.get('http://book.douban.com/').text

pattern = re.compile('<li.?href="(.?)".?title="(.?)".*?', re.S)

results = re.findall(pattern, content)

print(results)

代码在 results = re.findall(pattern, content)这里卡住了,如果将

pattern = re.compile('<li.?href="(.?)".?title="(.?)".*?', re.S)

去掉一个()

pattern = re.compile('<li.?title="(.?)".*?', re.S)

就能正确的运行,请问我是哪里出错了?希望大家指教


Python新手学习正则表达式时碰到的一个问题

8 回复

正则不对,?表示重复零次或一次,网址和标题哪有那么短


正则表达式(regex)是Python里处理字符串匹配的利器,但新手常被它的语法搞晕。最常见的问题就是搞不清元字符(比如 ., *, +, ?, [], ())的用法,或者不理解贪婪/非贪婪匹配的区别。

举个典型例子,你想从字符串里提取所有数字,新手可能会直接写 \d,但这样只能匹配单个数字。正确做法是用 \d+ 来匹配连续的数字:

import re

text = "我有3个苹果和15个橘子"
pattern = r'\d+'
result = re.findall(pattern, text)
print(result)  # 输出: ['3', '15']

另一个常见坑点是特殊字符的转义。比如想匹配字面意义的点号.,得写成 \.,否则.在正则里代表任意字符。

text = "文件名为data.txt"
pattern = r'\.txt'  # 匹配 .txt
result = re.search(pattern, text)
if result:
    print("找到:", result.group())  # 输出: .txt

简单说,学正则的关键是多练,从简单模式开始,逐步复杂化。

写代码不能试着写啊…

1 解析网页直接上正则不太好,2requests 不加 head 容易被封

非要上正则的话,你把 findall 参数搞混错了…

建议再看文档: http://www.runoob.com/python/python-reg-expressions.html

还可以了解一下 Beautifulsoup 等等

了解下 xpath 不过正则还是得学的

html 用正则解析效率很低和出错率挺高的,用这个库吧: https://github.com/kennethreitz/requests-html,requests 的作者的另一库,非常好用

学正则的时候验证一下表达式
http://tool.oschina.net/regex

不想正则搞晕,直接用谷歌浏览器的 copy xpath 功能加上 xpath helper 插件吧

问题在于问号 “?” 问好表示非贪婪

回到顶部