上一篇是转载别人的,自己想来做一下总结,写一篇属于自己的。
正则表达式:可以判断目标字符串是否符合特定的要求,比如判断是否为手机号,身份证号,邮箱号。
在正则表达式中,下面的一些特殊字符代表不同含义,可能总结的不够完整。
\d:表示任意的一位数字
\d\d:表示任意的两位数字
\w:表示任意的一个字母和数字
\s:表示空格
.:表示任意的内容 比如1,2,3,a,b,c
a.:在a后面匹配任意内容 比如ab a1 a2 ac
*:表示内容出现0次到多次
+:表示内容出现一次到多次
?:表示内容出现0次到1次
^:脱字符 表示以...开头
$:表示以...结尾
{n}:表示内容重复n次
{n,m}:表示最少重复n次,最多重复m次
{n,}:表示最少重复n次
{,m}:表示最多重复m次
# pattern模式
# compile编译 后面写正则表达式的内容
# ()代表从目标字符串当中获取的子串
# 每一个()就是一个group组
pattern = re.compile('(\d+)(\w+)')
content = '123helloworld'
# match匹配
result = re.match(pattern,content)
if result:
# 返回的是一个匹配对象
print(result)
# 返回的符合要求的全部类容
print(result.group(0))
print(result.group(1))
print(result.group(2))
else:
print('不符合')
<_sre.SRE_Match object; span=(0, 13), match='123helloworld'>
123helloworld
123
helloworld
pattern = re.compile('my')
result = re.match(pattern,'myself')
print(result.group(0))
my
贪婪模式与非贪婪模式
正则表达式默认为贪婪模式,尽量找到所有的符合要求的类容
.*称之为贪婪模式
content = 'aabbabab11b222'
pattern = re.compile('(a.*b)')
result = pattern.match(content)
print(result)
<_sre.SRE_Match object; span=(0, 11), match='aabbabab11b'>
.*?称之为非贪婪模式
content = 'aabbabab11b222'
pattern = re.compile('(a.*?b)')
result = pattern.match(content)
print(result)
<_sre.SRE_Match object; span=(0, 3), match='aab'>
匹配任意字符开头,后面找到一个以b开始以b结尾的内容
pattern = re.compile('.*?(b.*?b)')
result = pattern.match(content)
print(result)
<_sre.SRE_Match object; span=(0, 4), match='aabb'>
*+ 同为贪婪模式
*至少0次 至多无线次
+ 至少1次 至多无限次
pattern = re.compile('(a.+b)')
result = pattern.match(content)
print(result)
<_sre.SRE_Match object; span=(0, 11), match='aabbabab11b'>
r raw string 会将字符串里的转义字符输出出来
print('hello \n world')
print(r'hello \n world')
hello
world
hello \n world
匹配连续3个数字
title = '0123Hello world'
# pattern = re.compile(r'\d\d\d')
pattern = re.compile(r'\d{3}')
result = pattern.match(title)
print(result)
<_sre.SRE_Match object; span=(0, 3), match='012'>
匹配全国固话 0371-66666666
pattern = re.compile(r'(\d{4})-(\d{8})')
result = pattern.match('0371-68686688')
print(result.group(1))
print(result.group(2))
0371
68686688
| 或者 设置用于不同情况的正则
pattern = re.compile('((haha|heihei)balabala)')
result = pattern.match('hahabalabala')
result = pattern.match('heiheibalabala')
print(result)
<_sre.SRE_Match object; span=(0, 14), match='heiheibalabala'>
search 找到字符串当中第一个负责正则的内容 注意:只找到第一个
pattern = re.compile(r'http')
# search 查找
result = pattern.search('www.jd.com,http://www.taobao.com')
print(result)
<_sre.SRE_Match object; span=(11, 15), match='http'>
pattern = re.compile(r'you')
result = pattern.search('I love you , I miss you , I hate you')
print(result)
<_sre.SRE_Match object; span=(7, 10), match='you'>
findall 找到所有符合的类容
content = '12345,上山打老虎,老虎没打着,大只小松鼠,55555'
pattern = re.compile(r'\d{5}')
result = pattern.findall(content)
print(result)
['12345', '55555']
sub:替换子串(字符串的一部分)
\s:匹配空白的类容
content = '杨 过对战金轮法王,郭靖观战'
pattern = re.compile(r'杨\s*过')
result = pattern.sub('吕布',content)
print(result)
吕布对战金轮法王,郭靖观战
pattern = re.compile(r'金轮法王')
result = pattern.sub('服部半藏',result)
print(result)
吕布对战服部半藏,郭靖观战
key_world = [
(r'杨\s*过','吕布'),
(r'金轮法王', '服部半藏'),
(r'郭靖','东方不败')
]
for pattern , replace in key_world:
pattern = re.compile(pattern)
content = pattern.sub(replace,content)
print(content)
吕布对战金轮法王,郭靖观战
吕布对战服部半藏,郭靖观战
吕布对战服部半藏,东方不败观战
找到手机号段对应
pattern = re.compile(r'^((13[0-9])|(14[67])|(15[0-3]|15[5-9])|(18[0|5-9]))\d{8}$')
result = pattern.match('14639760302')
print(result)
<_sre.SRE_Match object; span=(0, 11), match='14639760302'>