文章目录
一、什么是正则表达式
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
正则表达式的特点:
- 灵活性、逻辑性和功能性非常强;
- 可以迅速地用极简单的方式达到字符串的复杂控制。
- 对于刚接触的人来说,比较晦涩难懂。
二、正则表达式的匹配
(1)单个字符匹配
-
有些特殊字符在[ ]中被赋予新的特殊含义,如
^
出现在
[]
中的开始位置表示取反,它出现在
[]
中的其他位置表示其一个普通字符 -
有的普通字符变为特殊字符,如
-
在
[ ]
中的位置不是第一个字符则表示一个数字或字母区间,如果在
[ ]
中的位置是第一个字符则表示其本身(一个普通字符) -
在
[ ]
中,如果要使用
-
,
^
或
]
,可在在它们前面加上反斜杠,例如
[\^]
(2)匹配边界
(3)重复次数
说明: {m,n}中的m和n可以省略其中一个,{,n}相当于{0,n},{m,}相当于{m,整数最大值}。
(4)预定义字符集
(5)逻辑分组
三、python中re模块的使用
# 模块
import re
# 方法
match.group() #返回匹配对象
match.group(0)#获取匹配结果,结果同上
match.span() #获取匹配范围
match.start() #匹配开始位置
match.end() #匹配结束位置
举例
import re
# 1.将正则表达式编译成一个pattern对象
pattern = re.compile('\d+')
# 2.匹配字符串
str = '12hello 456,a;b'
m1 = pattern.match(str)
# 3.获取
print(m1) # <_sre.SRE_Match object; span=(0, 2), match='12'>
print(m1.group()) # 12
print(m1.span()) # (0, 2)
print(m1.start()) # 0
print(m1.end()) # 2
四、re模块常用方法
1)re.compile()
该方法用来生成正则表达式对象,其语法格式如下:
regex=re.compile(pattern,flags=0)
参数说明:
pattern:正则表达式对象。
flags:代表功能标志位,扩展正则表达式的匹配。
2) re.findall()
根据正则表达式匹配目标字符串内容。
re.findall(pattern,string,flags=0)
该函数的返回值是匹配到的内容列表,如果正则表达式有子组,则只能获取到子组对应的内容。
参数说明如下:
pattern:正则表达式对象。
string:目标字符串
flags:代表功能标志位,扩展正则表达式的匹配。
3) regex.findall()
该函数根据正则表达式对象匹配目标字符串内容。其语法格式如下:
regex.findall(string,pos,endpos)
参数说明:
string 目标字符串。
pos 截取目标字符串的开始匹配位置。
endpos 截取目标字符串的结束匹配位置。
4) re.split()
该函数使用正则表达式匹配内容,切割目标字符串。返回值是切割后的内容列表。参数说明:
re.split(pattern,string,flags = 0)
参数说明:
pattern:正则表达式。
string:目标字符串。
flags:功能标志位,扩展正则表达式的匹配。
5) re.sub
该函数使用一个字符串替换正则表达式匹配到的内容。返回值是替换后的字符串。其语法格式如下:
re.sub(pattern,replace,string,max,flags = 0)
其参数说明:
pattern:正则表达式。
replace:替换的字符串。
string:目标字符串。
max:最多替换几处,默认替换全部
flags:功能标志位,扩展正则表达式的匹配。
6) re.search()
匹配目标字符串第一个符合的内容,返回值为匹配的对象。语法格式如下:
re.search(pattern,string,flags=0)
参数说明:
pattern:正则表达式
string:目标字符串
使用注意:
在平时的使用中,我们一般不使用re.compile方法,因为在源码中已经自动调用该方法
而其他的函数例如findall,search这些方法也都是自动调用该方法的
五、flags功能标志位
功能标志位的作用是扩展正则表达的匹配功能。常用的 flag 如下所示:
缩写元字符 | 说明 |
---|---|
A | 元字符只能匹配 ASCII码。 |
I | 使匹配对大小写不敏感 |
S | 使 . 匹配包括换行在内的所有字符 |
M | 多行匹配,影响 ^ 和 $ |
注意:可以同时使用福多个功能标志位,比如
flags=re.I|re.S
六、正则表达式中的分组
分组时通过
()
来表示的,一个括号就表示一个分组。
分组的作用
:
(1)筛选特定内容。
取分组内容可以通过match对象的group方法来去。
group(1)表示取正则表达式中第一个括号的内容,依次类推。
import re
content = '{name:"zhangsan",age:"10",hobby["basktball","football","read"]}'
pattern = re.compile(r'{name:"(\w+)",age:"(\d+)".+')
match = pattern.search(content)
print(match.group(1))#zhangsan
print(match.group(2))#10
--------------------------------------------------------------------
(2)可以在同一个表达式的后面引用前面的分组表达式。
s = "<html><h1>正则表达式</h1></html>"
import re
s = "<html><h1>正则表达式</h1></html>"
pattern = re.compile(r'<(html)><(h1)>(.*)</\2></\1>')
match = pattern.search(s)
print(match.group(3)))#正则表达式
七、贪婪和非贪婪模式
-
贪婪是用
*
控制的 - 非贪婪是用?来控制
-
*
和
?
都是作用表示重复次数的元字符的。 - 正则默认是贪婪模式,所以数量控制符默认是取最大值,也是贪婪。
-
在表示重复的元字符后面加一个
?
,此时就是非贪婪,取这个重复元字符的最小值。
八、通用匹配正则表达式
.*?
配合re.S,即:匹配包括换行在内的所有字符
import re
content = '{name:"zhangsan",age:"10",hobby:["basktball","football","read"]}'
pattern = re.compile(r'.*?"(.*?)".*?"(.*?)".*?',re.S)
match = pattern.search(content)
print(match)
print(match.group(1))
print(match.group(2))
九、使用正则的一些处理实例
1.去掉英文符号
import string
def remove_english_punctuation(text):
"""去除所有英文符号"""
punctuation_string = string.punctuation
# print("所有的英文标点符号:", punctuation_string)
for i in punctuation_string:
text = text.replace(i, '')
return text
2.去掉中文符号
from zhon.hanzi import punctuation
def remove_chinese_punctuation(text):
punctuation_str = punctuation
# print("中文标点符合:", punctuation_str)
for i in punctuation_str:
text = text.replace(i, '')
return text
3.去掉h5标签
def data_cleaning(content):
"""
内容数据清洗,去除文字中的H5代码
"""
Cstr = content
result = re.findall(r'<.*?>', Cstr)
for r in result:
Cstr = Cstr.replace(r, '')
return Cstr.replace('\n', '').replace('\t', '').replace('\r', '')