A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

正则表达式

用来处理字符串,对字符串进行检索和替换,另外正则在python爬虫的应用也是相当广泛!

特点

灵活性、逻辑性和功能性非常强
可以迅速地用极简单的方式达到字符串的复杂控制
正则语法
# 1、数字和字母都表示它本身, . 表示匹配除了换行以外的任意字符,        \. 表示匹配 .
# 2、很多字母前面添加 \ 会有特殊含义
        - \n:换行
        - \t:制表符
    - \d: 匹配数字,等价[0-9]
    - \D:非数字,等价于[^0-9]
    - \w:表示数字、字母以及下划线,中文,等价于[0-9a-zA-Z_]
    - \W:表示\w取反
    - \s:表示任意的非打印字符(空格、换行、制表符)
    - \S:表示非空白字符
# 3、绝大多数标点都有特殊含义
        - ():用来表示一个分组,如果需要表示括号,需要使用 \
        - []: 匹配范围,[0-9] 表示0~9范围中的一个,[0-9a-zA-Z]
        - |: 表示或者的意思 re.search(r'f(x|y|z)m','pdsfxm')   匹配fxm
        - {},{2,},{,3},{1,3}:用来限定前面元素出现的次数  re.search(r'go{2}d','good')
        - *: 表示前面的元素出现的次数为0次及以上,等价于{0,}
        - +: 表示前面的元素出现的次数为1次及以上,等价于{1,}
        - ^:以指定的内容开头,或者取反的意思
        - $:以指定的内容结尾
# 4、 ? 的两种用法
        - 规定前面元素出现的次数最多只能出现1次,等价于{,1}
        - 将贪婪模式转换为非贪婪模式(重点)       
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
re模块的介绍
该模块是python中专门用于处理正则的默认,提供了相关的方法

常用方法
外汇经纪商动态https://www.fx61.com/news

match、search 只查询一次
finditer 查找到所有的匹配数据放到一个可迭代对象中
findall 把查找到的所有字符串结果放到一个列表中
fullmatch 完全匹配,字符串需要满足正则表达式
Match类的使用
调用re.match,re.search或者对re.finditer的遍历返回的对象都是re.Match对象

Match类的属性和方法
pos、endpos 被查找字符串的起始和终端位置
span( ) 匹配到的下标位置(元组)
group 分组的概念
import re

m = re.search(r'c.*z', 'abcdefgz')
print(m.pos)  # 0
print(m.endpos)  # 8
print(m.span())  # (2, 8)
# 使用group获取获取到匹配的字符串
print(m.group()) # cdefgz

# group表示正则表达式的分组
# 1、在正则表达式里使用()表示一个分组
# 2、如果没有分组,默认只有一组
# 3、分组的下标从0开始

# 这里有4个分组
m1 = re.search(r'(1.*)(2.*)(3.*4)', 'a1bcd2efgh3ij4k')
print(m1.group())  # 默认就是第0组  1bcd2efgh3ij4
print(m1.group(0))  # 第0组就是把整个正则表达式当做一个整体  1bcd2efgh3ij4
print(m1.group(1))  # 1bcd
print(m1.group(2))  # 2efgh
print(m1.group(3))  # 3ij4

#  groups() 将分组以元组的形式返回
print(m1.groups())  # ('1bcd', '2efgh', '3ij4')

# (?P<name> 表达式) 给分组取个名字
m2 = re.search(r'(?P<one>1.*)(?P<two>2.*)(?P<three>3.*4)', 'a1bcd2efgh3ij4k')
print(m2.groupdict())  # {'one': '1bcd', 'two': '2efgh', 'three': '3ij4'}
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
compile

在re模块,可以使用re.方法调用函数,还可以调用re.compile得到一个对象

import re

# 这两种写法没有区别
m = re.search(r'm.*a', '111m22222a')
print(m)  # <re.Match object; span=(3, 10), match='m22222a'>

m2 = re.compile(r'm.*a')
result = m2.search('111m22222a')
print(result) # <re.Match object; span=(3, 10), match='m22222a'>

1
2
3
4
5
6
7
8
9
10
正则修饰符
正则修饰符是对表达式进行修饰

re.I 使匹配对大小写不敏感
re.M 多行匹配,影响 ^ 和$
re.S 使 . 匹配包括换行在内的所有字符
import re

# . 表示除了换行以外的任意字符
x = re.search(r'm.*a', 'abcdmo\nxxxa')
print(x)  # None

# re.S 匹配换行
y = re.search(r'm.*a', 'abcdmo\nxxxa', re.S)  # 让 . 匹配换行
print(y)

a = re.search(r'x', 'helloXyz')
print(a)  # None
# re.I 忽略大小写
b = re.search(r'x', 'helloXyz', re.I)
print(b)  # <re.Match object; span=(5, 6), match='X'>

# re.M 让$ 匹配到换行
m = re.findall(r'\w+$', 'i am boy\n you are girl\n he is man')
print(m)  # ['man']
n = re.findall(r'\w+$', 'i am boy\n you are girl\n he is man', re.M)
print(n) # ['boy', 'girl', 'man']


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
正则替换
sub

import re

# 把数字替换成x
m = re.sub(r'\d', 'x', 'hello123wor123ld')
print(m)  # helloxxxworxxxld

n = re.sub(r'\d+', 'x', 'hello123wor123ld')
print(n) # helloxworxld


# 需求:将p中内容的数字乘2
p = 'hello50good34'
def test(x):
    y = int(x.group(0))
    y *= 2
    return str(y)  # 这里只能以字符串的形式返回


print(re.sub(r'\d+', test, p)) # hello100good68
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
贪婪模式与非贪婪模式
在正则表达式里,默认采用的是贪婪模式,尽可能匹配多的字符串

在贪婪模式后面添加?,可将贪婪模式转化为非贪婪模式

import re

m = re.search(r'm.*a', 'abcm123a456a')
print(m)  # m123a456a,这里为什么不是m123a呢?因为这里默认使用的贪婪模式
n = re.search(r'm.*?a', 'abcm123a456a')
print(n)  # m123a    使用?将贪婪模式转化为非贪婪模式

# ?
print(re.match(r'aa(\d+)', 'aa123bb456').group(1))  # 123
print(re.match(r'aa(\d+?)', 'aa123bb456').group(1))  # 1
print(re.match(r'aa(\d+?)', 'aa123bb456').group(0))  # aa1

# 虽然说是尽可能少的匹配,但也要满足匹配呀
print(re.match(r'aaa(\d+)ddd', 'aaa2333ddd').group(0))  # aaa2333ddd
print(re.match(r'aaa(\d+?)ddd', 'aaa2333ddd').group(1))  # 2333

print(re.match(r'aaa(\d+).*', 'aaa2333ddd').group(0))  # aaa2333ddd
print(re.match(r'aaa(\d+?).*', 'aaa2333ddd').group(1))  # 2

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马