python正则表达式学习笔记(个人总结)

python正则表达式学习笔记

个人学习笔记和总结
作者:YRH

时间:2020.08.09

1.正则表达式匹配符

匹配符 功能
\w 匹配字母数字及下划线
\W 匹配非字母数字及下划线
\s 匹配任意空白字符,等价于[\t\n\r\f].
\d 匹配任意数字,等价于[0-9]
\D 匹配任意非数字
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符
\z 匹配字符串结束
\G 匹配最后匹配完成的位置
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配字符串的开头
& 匹配字符串的末尾
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[…] 用来表示一组字符:[^abc]匹配除了a,b,c之外的字符。
* 匹配0个或多个的表达式。
+ 匹配1个或多个的表达式。
匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
{n} 精确匹配n个前面表达式。
{n,m} 匹配n到m次由前面的正则表达式定义的片段,贪婪方式
a|b 匹配a或b
() 匹配括号内的表达式,也表示一个组
.*? 可以匹配任意内容。泛滥匹配,除了空格换行

2.贪婪匹配
在正则表达式中一个表达式后面加一个问号表示,表示只匹配0-1次,为不贪婪
加上*号表示前面表达式匹配0或者多个表达式
总结:尽量使用泛匹配、使用括号得到匹配目标。尽量使用非贪婪模式。
re.S:有换行则可以用
re.I:匹配忽略大小写

3.compile()函数
编译正则表达式模式,返回一个对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)
格式:
re.compile(pattern,flags=0)
pattern: 编译时用的表达式字符串。
flags 编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等。常用的flags有:re.S,re.I,re.L.re.M,re.X,re.U。
例子:

import re

text = "Hello world"
com = re.compile(r"\w*ll\w*") #找出带有ll的字符
print(re.findall(com,text)) #进行匹配输出['Hello']

4.match()函数

尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none
格式:
re.match(pattern,string,flags=0)
pattern是正则表达式
string是需要匹配的内容
flags:正则表达式使用时的控制标记
例子:

import re

text = "Hello world"
t1 = re.match(r"H\w*",text)
t2 = re.match(r"w\w*",text)
print(t1) #输出
print(t2) #输出None,因为文本不是w开头的,匹配不到

5.search()函数

扫描整个字符串并返回第一个成功的匹配,不要求是开头匹配
格式:
re.search(pattern,string,flags=0)
pattern是正则表达式
string是需要匹配的内容
flags:正则表达式使用时的控制标记
总结:为匹配方便,能用search就不用match
例子:

import re

text = "Hello world"
t1 = re.search(r"H\w*",text)
t2 = re.search(r"w\w*",text)
print(t1) #输出
print(t2) #输出

6.match object对象方法

match和search一旦匹配成功,返回的是一个match object对象,而要提取这个match object对象中的文本需要使用下面方法进行提取:

方法 功能
. group() 返回被 RE 匹配的字符串
. start() 返回匹配开始的位置
. end() 返回匹配结束的位置
. span() 返回一个元组包含匹配 (开始,结束) 的位置

其中.group() == .group(0) == 所有匹配的字符(即匹配正则表达式整体结果)
group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。
m.groups() 返回所有括号匹配的字符,以tuple格式。

例如:

import re

a = "123abc456"
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0))   #123abc456,返回整体
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1))   #123
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2))   #abc
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3))   #456

7.findall()函数
搜索字符串,以列表形式返回全部能匹配的字符串
(这个是匹配全文符号条件的,返回的是一个列表[])
格式:
re.findall(pattern,string,flags=0)
pattern是正则表达式
string是需要匹配的内容
flags:正则表达式使用时的控制标记
例子:

import re

a = html = """ '''

经典老歌

经典老歌列表

''' """
result = re.findall(r'singer="(.*?)">(.*?)<', a, re.S) b = result print(b) for c in b: print(c[0]) print(c[1])

8.sub()函数
在一个字符串中替换所有匹配正则表达式的子串 返回替换后的字符串(与replace()函数功能相同)
格式:
re.sub(pattern,repl,string,count=0,flags=0)
pattern:正则表达式的字符串或原生字符串表示
repl:替换匹配字符串的字符串
string:待匹配字符串
count:匹配的大替换次数
flags:正则表达式使用时的控制标记
(当我们在搜索字符串是出现一些妨碍我们的字符可以他们替换成空格)

import re

a = "12345abc2344"
text = re.sub(r"\d","",a) #将文本中所有数据去掉
print(text)

9.subn()函数
返回一个tuple,其元素1是替换后的字符,元素2是替换的次数
格式:
re.subn(pattern,repl,string,count=0,flags=0)
pattern:正则表达式的字符串或原生字符串表示
repl:替换匹配字符串的字符串
string:待匹配字符串
count:匹配的大替换次数
flags:正则表达式使用时的控制标记

import re

a = "12345abc2344"
text = re.subn(r"\d", "", a)  # 将文本中所有数据去掉
print(type(text))  # 
print(text)  # ('abc', 9)
print(text[0])  # abc

10.split()
将一个字符串按照正则表达式匹配结果进行分割 返回列表类型
格式:
re.split(pattern,string,maxsplit=0,flags=0)
pattern:正则表达式的字符串或原生字符串表示
string:待匹配字符串
maxsplit:最大分割数,剩余部分作为后一个元素输出(当等于1是只分割一个)
flags:正则表达式使用时的控制标记

返回的是列表形式

import re

a = "abc1bk1ojnb4ihg1mh"
b = re.split(r"\d", a)  # 根据数字分割
print(b)  # ['abc', 'bk', 'ojnb', 'ihg', 'mh']

11.finditer()
搜索字符串,返回一个匹配结果的迭代类型,每个迭代 元素是match对象
格式:
re.finditer(pattern,string,flags=0)
pattern:正则表达式的字符串或原生字符串表示
string:待匹配字符串
flags:正则表达式使用时的控制标记

你可能感兴趣的:(python爬虫,python,正则表达式)