python之爬虫

python之爬虫------re模块

调用re模块
import re
一、使用
1.请求网页得到源代码
2.编写正则表达式
3.从源代码中匹配满足表达式的内容
二、规则
字符
一般字符匹配自身 hello |hello
. 字符 匹配任意字符 a.b | a1b axb a.b acb a中b
\ 转移字符 a.c | a.c
[] 字符集,匹配字符集中的任意一个字符
[0-9]匹配任意一个数字
[a-zA-Z]匹配英文字母
[^0-9 ]匹配除-9以外的任意一个字符
[^0-9] 匹配0-9和^
预定义字符
\d 所有的数字 0-9
\D 非数字
\w 所有的单词 0-9 a-z A-Z
\W 非单词字符
\s 空白字符 空格换行缩进
\S 非空白字符
数量词
’ * ’ 匹配前一个字符0-无限次 a* | a aa aaa aaaaaaaaaaaa
‘+’ 匹配前一个字符1-无限次 a+c | a c a c
? 匹配前一个字符0-1次 a_?c | ac a_c
{m} 匹配前一个字符m次 x{3} | xxx
{m,n} 匹配前一个字符 最少m次,最多n次
{m,} 匹配前一个字符,最少m次 最多无限
.’'贪婪模式 ''号 默认是最大匹配模式
.*? 非贪婪
边界字符
^ 字符串的开头
$字符串的结尾
\A字符串的开头(python)
\Z字符串的结尾(python)
\b 匹配单词和非单词的边界 m\b m后边一定是一个非单词
\B 两边要么都是单词 要么都是非单词
逻辑和分组
| 或者 tom|jerry tom jerry
() 代表分组 hello( tom|jerry ) hello to, hello jerry
\num 引用分组

三、使用python的re模块
compile("")编写正则表达式
phone_regex= re.compile("1[3-9]\\d{9}")
匹配手机号
match() 从字符串开头开始匹配正则,匹配成功返回对象,匹配不到返回none,只能匹配一次,匹配到了 就结束了
result=phone_regex.match(phoneNum)
search 从字符串的任意位置开始匹配,只能匹配一次,匹配到了 就结束了
result=phone_regex.search(phoneNum)
findall() 匹配所有满足条件的字符串,返回列表的形式,如果没有匹配到返回空列表,如果正则里边包含分组,,那么只会返回分组内的字符

findall() 匹配所有满足条件的字符串
result=phone_regex.findall(phoneNum)
print(result)  # 如果没有指定分组 ['13811111234', '18967543421']
如果指定了分组,会把分组的内容以元组元素的形式返回
[('13811111234', '1111', '1234'), ('18967543421', '6754', '3421')]

finditer()以可迭代对象的形式返回

finditer()  以可迭代对象的形式返回,
result=phone_regex.finditer(phoneNum)
print(result)
for once in result:
	print(once)
	print(once.group())
	print(once.group(1))

split()以指定的正则表达式分割

split()  分割字符串
str1="唱,跳_rap,篮球"
print(str1.split("_")) 	
split_regex=re.compile(",|_")
split_regex=re.compile("[,_]")
print(split_regex.split(str1))

sub 将指定字符替换成指定的字符
subn 返回替换后的字符串和替换次数

# sub () 替换  subn 同sub 返回的是一个元组,多一个替换次数
savePath="\"/\\a?.t*x|><t"
# savePath=savePath.replace('/',"").replace('\\','').replace('>','').replace("<",'').replace("?",'')
special_chars_regex=re.compile("[/\\\\><\\|\\?\"\\*:]")
# 第一个参数是替换成什么,第二个参数是 源字符串  第三个参数是替换的次数
# savePath=special_chars_regex.sub("",savePath,3)
# print(savePath)
result1=special_chars_regex.subn("",savePath)
print(result1)

\num引用分组 num从1开始,而不是从0开始
匹配中文`

# 匹配中文 [\u4e00-\u9fa5]
str2="我的英文名是Tom,my chinese name is 汤姆"
chines_regex=re.compile(r"[\u4e00-\u9fa5]+")
print(chines_regex.findall(str2)

对于?:的解释

url_regex=re.compile("(?:http|https|ftp|ftps)://www.\\w+.(?:com.cn|com|org|net)")
print(url_regex.findall(str3)) #[('http', 'com.cn'), ('https', 'com'), ('ftp', 'org'), ('ftps', 'net')]
# 小技巧,如果不想把括号当成分组的话,可以 在开始的括号后写上  ?:,这个时候这个括号中的内容就不会当成是分组了
# 加上了 ?:  ['http://www.abc.com.cn', 'https://www.sae.com', 'ftp://www.nnn.org', 'ftps://www.jksad.net']
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值