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']