正则表达式
资源文件
https://tool.oschina.net/regex/
正则表达式
正则表达式是一种特殊的字符串模式,用于匹配一组字符串。它最早出现于 20 世纪 40 年代,当时用来描述正则语言,而到 20 世纪 70 年代才真正出现在程序设计领域。
通用字符类型
原子字符 | |
---|---|
d | 匹配任意一个十进制数字,等价于[0-9] |
D | 匹配任意一个除十进制数字以外的字符,等价于[^0-9] |
s | 匹配任意一个空白字符,等价于[nr\v] |
S | 匹配除空白字符以外任何一个字符,等价于[^nrlv] |
w | 匹配任意一个数字、字母或下画线,等价于[0-9a-zA-Z」 |
W | 匹配除数字、字母或下画线以外的任意一个字符,等价于[^0-9a-zA-Z] |
自定义原子表
#匹配 asp psp jsp
[apj]sp
元字符
元字符 | 含义描述 | |
---|---|---|
* | 匹配0次、1次或多次其前的原子 | |
+ | 匹配1次或多次其前的原子 | |
? | 匹配0次或1次其前的原子 | |
. | 匹配除了换行符外的任意一个字符 | |
\ | 匹配两个或多个分支选择 | |
{n} | 表示其前面的原子恰好出现n次 | |
{n,} | 表示其前面的原子出现不少于n次 | |
{n,m} | 表示其前面的原子至少出现n次,最多出现m次 | |
^或A | 匹配输入字符串的开始位置(或在多行模式下行的开头,即紧随一换行符之后) | |
$或Z | 匹配输入字符串的结束位置(或在多行模式下行的结尾,即紧随一换行符之前) | |
b | 匹配单词的边界 | |
B | 匹配除单词边界以外的部分 | |
[] | 匹配方括号中指定的任意一个原子 | |
[^] | 匹配除方括号中的原子以外的任意一个字符 | |
() | 匹配其整体为一个原子,即模式单元。可以理解为由多个单个原子组成的大原子 |
匹配案例
707-827-7019
458-898-4587
124-456-1021
\d{3,4}[-.]?
re库
Re库的主要功能函数
re.search(pattern,string,flags=0)
- 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象
re.match(pattern,string,flags=0)
- 从一个字符串的开始位置起匹配正则表达式,返回match对象
re.findall(pattern,string,flags=0)
- 搜索字符串,以列表类型返回全部能匹配的子串
re.split(pattern,string,maxsplit=0,flags=0)
- 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型
re.finditer(pattern,string,flags=0)
- 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素式match对象
re.sub(pattern,repl,string,count=0,flags=0)
- 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串
常用标记
flags:正则表达式使用时的控制标记
re.I (re.IGNORECASE) | 忽略正则表达式的大小写,即使[A-Z]也能匹配小写字符 |
---|---|
re.M (re.MULTILINE) | 正则表达式中的^操作符能够将给定字符串的每行当作匹配开始 |
re.S (re.DOTALL) | 使用re.S参数以后,正则表达式会将这个字符串作为一个整体,将“n”当做一个普通的字符加入到这个字符串中,在整体中进行匹配。 |
match对象
- 对象的属性
属性 | 说明 |
---|---|
.string | 待匹配的文本 |
.re | 匹配时使用的patter对象(正则表达式) |
.pos | 正则表达式搜索文本的开始位置 |
.endpos | 正则表达式搜索文本的结束位置 |
- 对象的方法
方法 | 说明 |
---|---|
.group(0) | 获取匹配后的字符串 |
.start() | 匹配字符串在原始字符串的开始位置 |
.end() | 匹配字符串在原始字符串的结束位置 |
.span() | 返回(.start(),.end) |
课程案例
匹配My cat is brown staccato中的单词cat
import re
string = "My cat is brown staccato"
resu = re.findall(r'\bcat\b',string)
print(resu[0])
创建一个正则表达式,当把它重复应用到目标文本Mary, Jane, and Sue went to Mary's house之上时,会匹配到Mary、Jane、Sue,且能再次匹配到Mary。之后再进行的匹配尝试都会失败。
import re
string = "Mary, Jane, and Sue went to Mary's house"
resu = re.findall(r'Mary|Jane|Sue',string)
for i in resu:
print(i)
创建一个正则表达式,使之匹配yyyy-mm-dd格式的任意日期,并且分别捕获年、月和日。目标是在处理匹配的代码中可以更容易处理这些分别捕获的值。你可以假设目标文本中的所有日期都是合法的。
import re
string = '''
2013-12-08abcded2014-11-11mary
'''
resu = re.finditer(r'\d{4}-(\d{2})-(\d{2})',string)
for i in resu:
print(i.group(0),"月:",i.group(1),"日:",i.group(2))
创建一个正则表达式来匹配按照yyyy-mm-dd格式的“神奇”日期。神奇日期指的是年份后2位与月份和该月的日期都是相同的数字。
import re
string = '''
2013-12-08abcded2014-11-11mary2011-11-11
'''
resu = re.search(r'\d{2}(\d{2})-\1-\1',string)
print(resu.group(0))
匹配一对XHTML标签<p>和</p>,以及二者之间的所有文本。在标签之间的文本也可以包含其他XHTML标签。
<p>
The very <em>first</em> task is to find the beginning of a paragraph.
</p>
<p>
Then you have to find the end of the paragraph
</p>
import re
string = '''
<p>
The very <em>first</em> task is to find the beginning of a paragraph.
</p>
<p>
Then you have to find the end of the paragraph
</p>
'''
resu = re.search(r'<p>(.*?)</p>',string,flags = re.S)
print(resu.group(1))
课后练习
匹配手机号
编写一个正则表达式来进行手机号匹配,需要注意手机号是
- 1开头,
- 第二位是3、4、5、7、8的任意一位
- 其他位是0-9的数字
13578941547abc124acbd789edx17589652314
代码
import re string = ''' 13578941547abc124acbd789edx17589652314 ''' resu = re.search(r'1[34578]\d{9}',string,flags = re.S) print(resu.group())
匹配十六进制颜色
编写一个正则表达式来匹配十六进制颜色
#ff0022cda#23acd%123#abcd4567#9988ab#FF89CC
代码
import re string = ''' #ff0022cda#23acd%123#abcd4567#9988ab#FF89CC ''' resu = re.findall(r'\#\w{6}',string) for i in resu: print(i)