文章目录
一、正则表达式中元素
正则表达式是一个特殊的字符序列,它能帮助我们方便的检查一个字符串是否与某种模式匹配。Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。
在正式接触re模块前,先了解与正则表达式相关的一些辅助字符:原子、元字符、(非)贪婪量词、锚位、择一匹配、分组等。
- 原子:正则表达式中实现匹配的基本单位,也称字符;
原子表(仅匹配一个) | 含义 |
---|---|
\d | 匹配任意一个数字,等价于字符集[0-9] |
\s | 匹配任意一个空白符,等价于字符集[\t\n\r\f ] |
\w | 匹配任意一个数字、字母和下划线,等价于[A-Za-z0-9_] |
\D | 匹配非数字字符 |
\S | 匹配非空白字符 |
\W | 匹配非单词字符 |
- 元字符:正则表达式中具有特殊含义的字符;
(贪婪)数量元字符 | 含义 | 贪婪量词 | 含义 |
---|---|---|---|
星号(*) | 匹配符号前面的条目0~任意次 | *? | 匹配的字符串越短越好 |
.* | 匹配任意字符0~任意次(换行符除外) | .*? | 匹配的字符串越短越好 |
加号(+) | 匹配符号前面的条目1~任意次 | +? | 匹配的字符串越短越好 |
问号(?) | 匹配符号前面的条目0~1次 | ?? | 优先考虑0次的情况 |
花括号({ }) | 指定具体的重复次数范围 | { }? | – |
{n,m} | 匹配n ~ m个 | {n,m}? | 优先匹配n次的情况 |
{n} | 匹配 n 个 | – | – |
{n,} | 匹配 n ~ 任意个 | {n,}? | 优先匹配n次的情况 |
{,m} | 匹配 0 ~ m个 | {,m}? | 优先匹配0次的情况 |
- 锚位:主要用来锁定被收索的字符串首尾,
锚位字符 | 含义 |
---|---|
脱字符(^),锚位\A | 表示字符串开头锚位(在字符集方括号中做取反用) |
美元符($),锚位\z | 表示字符串结尾锚位 |
【注】:python的正则表达式(字符)基础语法与perl的大致相同,详细语法规则参考perl的正则表达式语法介绍
二、python中正则表达式用法(re)
re 模块使 Python 语言拥有全部的正则表达式功能,他提供了多种正则表达式处理函数以方便我们使用:
- re.compile() 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
- re.match() 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 None。
- re.search() 扫描整个字符串并返回第一个成功的匹配。
- re.sub() 用于替换字符串中的匹配项。
- re.findall() 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。
- re.finditer() 和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
- re.split() 方法按照能够匹配的子串将字符串分割后返回列表。
【注】:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配;
【注】:match 和 search 是匹配一次,findall 匹配所有。
#!/usr/bin/python
import re
#(一)、compile()函数——将正则表达式转换成内部格式,提高代码执行效率
str="python666java"
#pat=r"\d+"
pat=re.compile(r"Python", re.I) #模式修正符——忽略大小写(re.I)
#print(re.search(pat,str)) #效率低
print(pat.search(str)) #效率较高
#(二)、match()/search()函数——匹配开头/匹配任意位置,单次匹配,匹配到之后就不会再进行匹配了
str1="pythonjavahtmljs"
str2="javapythonjavahtmljs"
pat1=re.compile(r"java")
print(pat1.match(str1)) #匹配开头,匹配不到返回None,str1开头为python
#打印:None
print(pat1.match(str2).group()) #group()返回匹配到的内容
#打印:Java
print(pat1.search(str1).group()) #匹配任意位置
#打印:Java
#(三)、findall()函数——查找所有匹配的内容,返回到一个列表中
str3="hello....hello----hello------hello--hello----hello"
pat3=re.compile(r"hello")
print(pat3.findall(str3))
#打印:["hello","hello","hello","hello","hello","hello"]
#(四)、finditer()函数——查找所有匹配的内容,装到一个迭代器中(效率高于findall())
str4="hello....hello----hello------hello--hello----hello"
pat4=re.compile(r"hello")
data=pat4.finditer(str4))
list1=[]
for i in data:
list1.append(i.group())
print(list1)
#打印:["hello","hello","hello","hello","hello","hello"]
#(五)、split()函数——按照能够匹配的子串将字符串分割后返回列表
str5="Tom,,,,Bob,,,,,,john,,bill"
pat5=re.compile(r",+")
result=pat5.split(str5)
print(result)
#打印:["Tom","Bob","John","Bill"]
#(六)、sub()函数——用于替换指定的目标字符串
str6="hello 123, hello 456!"
pat6=re.compile(r"\d+")
result1=pat6.sub("666",str6)
print(result1)
#打印:hello 666, hello 666!
参考:https://www.runoob.com/python/python-reg-expressions.html