正则表达式

一、正则表达式函数

match 这个函数是从头开始匹配且只能从头开始匹配
search 这个函数是可以从任意位置开始匹配

1
2
import re
string = "poythonypnyhjptyskphyjsa"

1.match函数

1
2
3
4
pat = "p.*?y"      # .*?y 是一个整体,代表懒惰模式运行(精准,用的比较多),匹配到第一个y为止
# pat = "o.*?y" # 不能正确匹配 因为match是从头开始匹配的意思
# result = re.match(pat,string,re.I)
# result = re.search(pat,string,re.I)

2.全局函数

1
2
3
4
# 格式:re.compile(正则表达式).findall(数据/字符串)
# compile(先编译一下)
# result = re.compile(pat).findall(string)
# print (result)

3.sub函数

1
2
3
# 把全局格式匹配出来的所有符合格式的替换成规定的字符串
result = re.sub(pat,"123",string)
print(result)

二、正则表达式模式修正符

在不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,
从而实现一些匹配结果的调整等功能

I 匹配的时候忽略大小写

M 多行匹配

L 本地化识别匹配

U 根据unicode字符进行解析

S 让.匹配包括换行符

1
2
3
4
5
6
import re
string = "Python"
pat = "pyt"
# re.I 自动忽略大小写
result = re.search(pat,string,re.I)
print(result)

三、元字符

元字符就是正则表达式中具有一些特殊含义的字符,比如重复N次的前面的字符
常用的元字符有以下几种:

. 匹配除换行符以外的任意一个字符

^ 这个符号如果不在原子表里面,匹配开始的位置
$ 匹配结束位置

  • 代表的是前面的原子重复出现0次,1次或多次
    ? 代表的是前面的原子重复出现0次,1次
  • 代表的是前面的原子重复出现1次或多次
    {n} 代表的是前面的原子恰好出现n次
    {n,} 代表的是前面的原子至少出现n次
    {n,m} 代表的是前面的原子至少出现n次,至多出现m次
    | 模式选择符或
    () 模式单元
1
2
3
4
5
6
7
8
9
import re
string = """<a target="_blank" href="https://www.ikwoonleefzorg.nl">"""
pat = """<a target="_blank" href="(http.*?)">"""

# string = """woshixiaokeai7891234hahuhayou"""
# pat = "h[^abc]you" 加上这个"^"符号之后,意思就是除了abc这三个元素其他的都可以匹配
# pat = "h.you" #匹配两个数字
result = re.findall(pat,string)
print(result)

四、正则表达式

正则表达式专用模块

1
2
import re
string = "woshixiaokeai"

1、普通字符作为原子

1
2
3
4
pat = "keai"
# re.search(正则表达式内容,字符串内容) 用于检索字符串
result = re. search(pat,string)
print(result)

2、非打印字符作为原子

1
2
3
4
5
6
7
(指的是不是输出出来的东西,类似于'\n'(换行符),'\t'(制表符之类的))
string2 = """woshixiaokeai
baidu
"""
pat = '\n'
result = re.search(pat,string2)
print(result)

3、通用字符作为原子

也就是说用一个字符代替一类东西,只要出现在这一类东西都能匹配出来
常用的有一下几个:

\W 匹配一个任意字母、数字、或者下划线
\w 匹配除了字母数字下划线以外的任意一个字符
\D 匹配任意一个十进制数
\d 除十进制数以外的任意一个字符
\s 匹配除空白字符以外的任意一个字符
\S 匹配空白字符

1
2
3
4
5
string = """woshixiaokeai 7891234hahu hayou"""
pat = "\s\w\d\d" #匹配两个数字
result = re.search(pat,string)
print(result)
string = """woshixiaokeai 7891234hahu hayou"""

4、原子表

1
2
3
4
5
6
像[xyz]这样的,然后从中任意提取一个原子 出来
string = """woshixiaokeai7891234hahuhayou"""
# pat = "h[^abc]you" 加上这个"^"符号之后,意思就是除了abc这三个元素其他的都可以匹配
pat = "h[abc]you" #匹配两个数字
result = re.search(pat,string)
print(result)

五、正则表达式实例讲解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# coding=utf-8
# 如何匹配 .com/.cn等的网址,以及如何匹配电话号码
import re
string = "<a href='http://www.baidu.com'>百度首页</a>"
pat = "[a-zA-Z]+://[^\s]*[.com|.cn]"
rst = re.compile(pat).findall(string)
# rst = re.findall(pat,string)
print(rst)

# 匹配电话号码
# pat = "\d{4}-\d{7}|\d{3}-\d{8}"

# rst = re.findall(pat,string)

# 爬取域名
string = '<a href="//kailaili.com'
# <a target="_blank" href="(http.*?)">
pat = "//[^\s]*"
rst = re.findall(pat, string)
print(rst)

# 提取ip
string = '</a><a href="http://149.202.171.21:9002" >'
pat = '</a><a href="([http|https]+://[^\s]*)'
rst = re.findall(pat, string)
print(rst)

string = "http://149.202.171.21:9002"
pat = '[http|https]+://([^\s]*):'
pat2 = '[0-9]:([^\s]*)'
rst = re.findall(pat, string)
rst2 = re.findall(pat2, string)
print(rst[0],rst2[0])

string = "http://149.202.171.21:9002"
pat = '[http|https]+://([^\s]*)'
# pat2 = '[0-9]:([^\s]*)'
rst = re.findall(pat, string)
# rst2 = re.findall(pat2, string)
print(rst[0])