正则表达式

正则表达式

1.什么是正则?

是编程语言,用于匹配字符串,没有唯一标准答案,能匹配到即可
是通用语言,在python中通过re模块来实现

2.正则在线工具

正则表达式速查表
https://www.jb51.net/shouce/jquery1.82/regexp.html

在线正则表达式测试
https://tool.oschina.net/regex

3.字符匹配

普通字符

大部分字符与自身完全匹配,例如表达式good与字符串'good'完全匹配

元字符(重要,常用)
常用元字符 解释
. 匹配单个字符
+ 匹配前一个字符1次或多次
? 匹配前一个字符0次或1次
* 匹配前面所有字符0次或多次
- 区间,匹配区间内字符或数字
[] 匹配方括号内任意字符,[a-zA-Z0-9]除此之外,还可以匹配不在区间范围内的字符^5
^ 匹配起始位置
$ 匹配字符串结束
\ 将元字符转义成普通字符 \ ^ []
{} 重复次数
| 表示或
() 分组,看成一个整体
\d 匹配一个数字字符,等价于[0-9]
\D 匹配一个非数字字符,等价于[^0-9]
\s 匹配任意空白字符,包括空格,制表符,换页符,等价于[\f\n\r\t\v]
\S 匹配任意非空字符,等价于[^\f\n\r\t\v]
\w 匹配包括下划线的任何单词字符,等价于[a-zA-Z0-9_]
\W 匹配任何非单词字符,等价于[^a-zA-Z0-9]

正则练习

1.匹配字符串中的数字one1two2three3

答案:\d

2.字符串a{4} 结果什么

答案:a4次

3.正则:c|d 匹配字符串abcd 结果是什么

答案:c或者d

4.正则:(ab) 匹配字符串 abd adc abb 结果是什么

答案:ab ab

5.字符串 ['AD123456','ac123456','AB12345'] 正则匹配2个大写字母+6个数字

[A-Z]{2}[0-9]{6}

4.python中正则相关函数

函数 说明
compile(pattern) 创建正则表达式的规则对象
match(pattern,string) 用正则表达式匹配字符串,成功返回匹配对象,否则返回None
search(pattern,string) 搜索字符串中第一次出现正则表达式的模式,成功返回匹配对象,否则返回None
split(pattern,string,maxsplit=0) 用正则表达式指定的模式分隔符拆分字符串,返回列表
sub(pattern,repl,string) 用指定的字符串替换原字符串中与正则表达式匹配的模式,可以用count指定替换的次数
fullmatch(pattern,string) match函数的完全匹配,从字符串开头到结尾
findall(pattern,string) 查找字符串所有与正则表达式匹配的模式,返回字符串的列表
import re

print('match 从起始开始匹配')
print(re.match('www', 'www.com'))
# 返回一个对象 <re.Match object; span=(0, 3), match='www'>
print(re.match('www', 'www.com').group())
# 需要group转化一下, 返回 www
print(re.match('www', 'com.www'))
# 起始位置没有www,不匹配返回 None

print('search 只返回第一个匹配的')
print(re.search('www', 'http://www').group())
# 返回www
print(re.search('www', 'http://www.com.www').group())
# 返回www

print('findall,从左到右,按顺序返回匹配列表,无匹配返回空列表')
print(re.findall('\d', 'one1two2three3'))
# 返回 ['1','2','3']
print(re.findall('\d', 'onetwothree'))
# 返回 []
print(re.findall('four', 'onefourtwofour'))
# 返回 ['four','four']

print('sub 替换')
print(re.sub('g..t', 'zhangsan', 'grrt 1gbbt2 gc3ct', ))
# 找到有gt的进行替换,且中间只有两个单字符 返回 zhangsan 1zhangsan2 gc3ct

print('split 切割')
print(re.split('\+', '123+456*789'))
# 按照+号进行切割 \进行转义 返回 ['123','456*789']

print('compile 创建匹配规则对象')
# compile 先进行了编译速度会更快一些
pattern = re.compile('[a-zA-Z]')
# 先创建匹配对象
result = pattern.findall('a1Bc_Z2yW')
# 再进行正则匹配 也可以直接用findall
print(result)
# 返回 ['a', 'B', 'c', 'Z', 'y', 'W']

5.贪婪匹配和非贪婪匹配

test
遇到以下两种正则,结果是什么
<.*>
贪婪从'<'开始到'>'结束,拿取所有的字符
答案:<div><span>test</div></span>
<.*?>
非贪婪从'<'开始到'>'结束,'?'匹配前一个字符1次或者0次;一次一次的匹配
答案:<div>
<span>
</div>
</span>
posted @ 2019-12-03 16:34  张珊33  阅读(216)  评论(0编辑  收藏  举报