爬虫常用的正则表达方式

python里的正则化库re,使用方法:

import re
line = 'boooooobby123'
regex_str = "^b.*3$"
re.match(regex_str, line)

正则化用到的特殊字符

  • ^ $ * ? {2} {2, } {2,5} |
  • [] [^] [] [^] [a-z]
  • \s \S \w \W
  • [\u4E00-\u9FA5] () \d
^

^a 匹配以字符a 开头的字符串

$

3$ 匹配以3结尾的字符串

*

^b.*3$ 匹配以b开头以3结尾的,中间有若干重复或不重复的字符(>=0)的字符串

?

非贪婪匹配方式。如果要匹配字符串'boooooobby123' 的子串 'boooooob'。 按正常的想法:

line = 'boooooobby123'
regex_str = ".*(b.*b).*"
match_obj = re.match(regex_str, line)
print(match_obj.group(1))

但是返回的结果是bb 。这是因为默认的是从后向前的贪婪匹配。使用非贪婪的匹配方法:

regex_str = ".*?(b.*b).*"

但输出结果是boooooobb 因为虽然前面使用了非贪婪匹配,但后面还是贪婪的,所以应该是:

regex_str = ".*?(b.*?b).*"
+

前面字符至少出现一次,如b.+b 匹配的就是bbb

{2}

限定字符出现的个数为2

{2,}

限定出现字符个数超过2

{2,5}

限定出现字符个数在2到5之间

|

或关系

line = 'boobby123'
regex_str = "(bobby|boobby)123"
match_obj = re.match(regex_str, line)
print(match_obj.group(1))

结果为boobby,如果想取完整的再加一个括号"((bobby|boobby)123)", 得到boobby123print(match_obj.group(2)) 得到boobby

[]

代表满足中括号里的条件。[abcd]oobby123, 指第一个字符是abcd中的任意一个,[0-9]代表0-9之间的数,[^1] 代表非1 。

比较常用的是匹配电话号码:

line = "18782902222"
regex_str = "(1[48357][0-9]{9})"
match_obj = re.match(regex_str, line)
print(match_obj.group(1))
.

代表任意字符

\s

反斜杠小s:一个空格符号

line = "你 好"
regex_str = "(你\s好)"
\S

反斜杠大s:一个不为空格的符号

\w

反斜杠小w:指[a-zA-Z0-9_]中的任意字符

\W

反斜杠大w:指不为[a-zA-Z0-9_]字符的任意字符

[\u4E00-\u9FA5]

指出现汉字

line = "study in 清华大学"
regex_str = ".*?([\u4E00-\u9FA5]+大学)"

得到清华大学 ,如果没有?则贪婪匹配到华大学

()

用来取子串

\d

提取数字

line = "XXX出生于2011年"
regex_str = ".*(\d{4})年" # 或者 ".*?(\d+)年"

实例

# 能满足匹配下面的5种情况
line = "xxx出生于2001年6月"
line = "xxx出生于2001/6/1"
line = "xxx出生于2001-6-1"
line = "xxx出生于2001-06-01"
line = "xxx出生于2001-06"
regex_str = ".*出生于(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}|[月/-]$|$))"
<think>好的,用户想了解Python爬虫正则表达式的概念和用法,包括使用方法和示例。首先,我需要回忆一下正则表达式在Python中的基本应用,尤其是与爬虫结合的部分。记得Python的re模块是处理正则表达式的标准库,所以得先介绍这个模块。用户提供的引用里提到re模块是内置的,不需要安装,直接导入使用,这点要确认正确,没错,是的。 接下来,我需要分步骤说明正则表达式在爬虫中的使用流程。第一步应该是导入re模块,然后可能需要发送HTTP请求获取网页内容,比如用requests库。但用户的问题集中在正则表达式本身,所以可能不需要详细讲解requests,但可以提一下,因为实际爬虫中获取网页内容是前提。不过用户给的引用里提到了爬虫正则表达式的结合,所以可能需要简要说明整个流程,包括获取页面和解析数据。 然后,常用正则方法有哪些呢?比如re.match、re.search、re.findall、re.finditer、re.sub这些。需要分别解释它们的作用,参数和返回值。比如match是从头开始匹配,search是搜索整个字符串,findall返回所有匹配的列表,finditer返回迭代器,sub用于替换。需要给出每个方法的示例代码,尤其是用户提供的引用中有一些例子,比如引用3中的re.match的例子,可以引用一下。 然后需要给出一个完整的爬虫示例,比如使用requests获取网页,然后用正则表达式提取数据,比如标题、链接、电话号码等。用户可能希望看到具体的例子,比如提取网页中的标题,或者邮箱地址,电话号码等常见数据。这时候需要注意正则表达式的写法,比如邮箱的正则表达式比较复杂,可能需要详细说明,但考虑到用户可能刚接触,可以简化一些,或者使用常见的模式。 还要注意用户提到的引用内容,比如引用2中提到了页面提取的实例,引用3中的match示例,引用4中解释了正则表达式是什么。需要确保回答中正确引用这些内容,并在适当的地方添加引用标识,比如在提到re模块时引用[^2],在例子中使用match时引用[^3],在解释正则表达式概念时引用[^4]。 同时,用户的问题还要求生成相关问题,可能需要考虑正则表达式的高级用法、常见问题处理、与其他解析库的比较,比如BeautifulSoup或lxml,以及实际应用中的注意事项,比如处理动态内容或反爬机制。但根据用户提供的引用,主要围绕正则表达式的基础和实例,所以相关问题可以围绕这些方面展开。 最后,要确保回答结构清晰,分点说明,代码示例正确,并且符合LaTeX格式的要求,行内公式用$...$,独立公式用$$...$$。虽然当前问题可能不涉及数学公式,但如果有变量或代码中的数学表达式,需要正确应用格式。例如,在正则表达式中如果有量词如{n,m},可能不需要用LaTeX,但如果有特殊符号,可能需要转义或说明。</think>### Python 爬虫正则表达式的使用方法及示例 正则表达式在 Python 爬虫中用于从网页文本中精准匹配和提取目标数据。以下是详细的使用方法和示例: --- #### 一、正则表达式基础 正则表达式(Regular Expression)是一种字符串匹配模式,通过特定语法规则描述字符的组合规律[^4]。 在 Python 中,通过内置的 `re` 模块实现正则表达式功能,无需额外安装。 --- #### 二、正则表达式使用流程 1. **导入模块** ```python import re ``` 2. **发送 HTTP 请求获取网页内容(示例)** ```python import requests response = requests.get("https://example.com") html_content = response.text ``` 3. **编写正则表达式规则** 例如匹配所有电话号码(假设格式为 `xxx-xxxx-xxxx`): ```python pattern = r'\d{3}-\d{4}-\d{4}' # \d 表示数字,{n} 表示重复次数 ``` 4. **应用正则方法提取数据** 常用方法包括: - `re.findall()`:返回所有匹配结果的列表 - `re.search()`:返回第一个匹配对象 - `re.match()`:从字符串起始位置匹配 --- #### 三、常用方法及示例 1. **`re.findall()` 提取所有匹配项** ```python emails = re.findall(r'[\w.-]+@[\w.-]+', html_content) print(emails) # 输出所有邮箱地址 ``` 2. **`re.search()` 查找首个匹配项** ```python match = re.search(r'<title>(.*?)</title>', html_content) if match: print("网页标题:", match.group(1)) # group(1) 获取第一个括号内的内容 ``` 3. **`re.sub()` 替换字符串** ```python cleaned_text = re.sub(r'<script.*?>.*?</script>', '', html_content, flags=re.DOTALL) ``` 4. **`re.match()` 从开头匹配** ```python header = re.match(r'^<h1>(.*?)</h1>', html_content) # 仅匹配字符串开头的<h1>标签 ``` --- #### 四、完整爬虫示例 ```python import re import requests # 获取网页内容 url = "https://example.com/contact" response = requests.get(url) html = response.text # 提取电话号码和邮箱 phones = re.findall(r'\d{3}-\d{4}-\d{4}', html) emails = re.findall(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', html) print("电话号码:", phones) print("邮箱地址:", emails) ``` --- #### 五、注意事项 1. **贪婪与非贪婪匹配** 使用 `.*?` 实现非贪婪匹配,避免匹配过多内容。 ```python # 提取<div>标签内容(非贪婪模式) re.findall(r'<div>(.*?)</div>', html) ``` 2. **处理多行文本** 使用 `flags=re.DOTALL` 匹配换行符: ```python re.findall(r'<p>(.*?)</p>', html, flags=re.DOTALL) ``` 3. **预编译正则表达式** 提高重复使用时的效率: ```python pattern = re.compile(r'\d+') numbers = pattern.findall(html) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值