1. 正则
-
定义:正则或叫正则表达式,是一种处理文字的规则
-
字符组:在一个字符的位置可以出现所有情况的集合就是一个字符组
-
表示数字的字符组:[0-9]
-
表示字母的字符组:[A-Za-z]
-
元字符:
-
.:匹配一个除换行符以外的任意字符
-
\w:匹配任意一个字母或数字或下划线
-
\s: 匹配任意一个空格
-
\d: 匹配任意一个数字
-
\W:匹配任意一个非字母或数字或下划线的字符
-
\S: 匹配任意一个非空格的字符
-
\D: 匹配任意一个非数字的字符
-
\n: 匹配一个换行符
-
\t: 匹配一个制表符
-
\b: 匹配一个单词的结尾
-
^: 匹配字符串的开始
-
$: 匹配字符串的结尾
-
a|b: 匹配字符a或字符b
-
(): 匹配括号内的表达式,也表示一个组
-
[...]: 匹配字符组中的任意一个字符
-
[^...]: 匹配非字符组中的其他任意一个字符
-
量词:
-
*: 匹配0次或多次
-
+: 匹配1次或多次
-
?: 匹配0次或1次
-
{n}: 匹配n次
-
{n,}: 匹配最少n次
-
{n,m}: 匹配最少n次最多m次
-
转义符:在python中,无论是正则表达式,还是待匹配的内容,都是以字符串的形式出现的,在字符串中\也有特殊的含义,本身还需要转义。在字符串前加上'r'
-
贪婪模式:在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配;如果想取消贪婪模式,需要在量词的后面加上'?'
2. re模块
-
描述:python中默认不支持正则表达式,需要导入re模块才能使用正则
import re
-
findall:把所有匹配的条件的结果加入列表返回
import re
a = re.findall('[\d]{2}', '11a22b33c44')
print(a)
>>>
['11', '22', '33', '44']
-
search:在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None
import re
b = re.search('[a-z]', 'Hello World')
print(b.group())
>>>
e
-
match:跟search用法一样,区别是match是从字符串开头进行匹配
import re
c = re.match('[A-Z]', 'Hello World')
print(c.group())
>>>
H
-
split:针对指定字符串进行分割,并且会按照执行的匹配进行一个一个分割
import re
d = re.split('[e r]', 'Hello World')
print(d)
>>>
['H', 'llo', 'Wo', 'ld']
-
sub:根据指定字符串把匹配的结果替换成新的字符,可以指定替换个数
import re
e = re.sub('l+?', 'y', 'Hello World', 2)
print(e)
>>>
Heyyo World
-
subn:跟sub用法一样,把替换的结果和次数用元组形式返回
import re
f = re.subn('o+', 'L', 'Hello World', 1)
print(f)
>>>
('HellL World', 1)
-
compile:将正则表达式编译为一个正则表达式对象,调用search方法直接针对指定字符串进行匹配
import re
g = re.compile('^ya')
s1 = g.search('yaya')
print(s1.group())
>>>
ya
-
finditer:跟findall用法一样,把所有匹配到的结果使用迭代器返回
import re
h = re.finditer('[a-z]', 'Hello World')
for i in h:
print(i.group())
>>>
e
l
l
o
o
r
l
d
3. 正则表达式进阶
import re
r1 = re.findall(r'www\.(baidu|qq)\.com', 'www.baidu.com')
print(r1)
r2 = re.findall(r'www\.baidu\.com|www\.qq\.com', 'www.baidu.com')
print(r2)
r3 = re.findall(r'www\.(?:baidu|qq)\.com', 'www.baidu.com')
print(r3)
>>>
['baidu']
['www.baidu.com']
['www.baidu.com']
import re
r1 = re.search(r'www\.(?P<web_name>baidu|qq)\.com', 'www.baidu.com').group()
print(r1)
r2 = re.search(r'www\.(?P<web_name>baidu|qq)\.com', 'www.baidu.com').group('web_name')
print(r2)
>>>
www.baidu.com
baidu
import re
r1 = re.search('<\w+>[\s\w]+</\w+>', '<h1>Hello World</h1>')
print(r1.group())
r2 = re.search('<(?P<tag_name>\w+)>[\s\w]+</(?P=tag_name)>', '<h1>Hello World</h1>')
print(r2.group())
print(r2.group('tag_name'))
>>>
<h1>Hello World</h1>
<h1>Hello World</h1>
h1
import re
r1 = re.findall(r'<\w+>[\s\w]+</\w+>', '<h1>Hello World</h1>')
print(r1)
r2 = re.findall(r'<(\w+)><(\w+)>[\s\w]+</\2></\1>', '<b><u>Hello World</u></b>')
print(r2)
>>>
['<h1>Hello World</h1>']
[('b', 'u')]
import re
r1 = re.split('\d+', 'yy1liyan2yange3ly')
print(r1)
r2 = re.split('(\d+)', 'yy1liyan2yange3ly')
print(r2)
>>>
['yy', 'liyan', 'yange', 'ly']
['yy', '1', 'liyan', '2', 'yange', '3', 'ly']
# 匹配整数
import re
r1 = re.findall(r"\d+","1-2*(60+(-40.35/5)-(-4*3))")
print(r1)
r2 = re.findall(r"-?\d+\.\d*|(-?\d+)","1-2*(60+(-40.35/5)-(-4*3))")
print(r2)
r2.remove("")
print(r2)
>>>
['1', '2', '60', '40', '35', '5', '4', '3']
['1', '-2', '60', '', '5', '-4', '3']
['1', '-2', '60', '5', '-4', '3']