正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某
个条件的子串等。
正则表达式可以判断目标字符串是否符合特定的要求。
比如判断是否为手机号,身份证号,邮箱。
字符 | 描述 |
\d | 表示任意的一位数字 |
\d\d | 两个\d就是表示任意的两位数字 |
\w | 表示任意的字母和数字 |
\s | 表示空格 |
. | 表示任意的内容 |
* | 表示内容出现0次到多次 |
+ | 表示内容出现1次到多次 |
? | 表示内容出现0次到1次 |
^ | 表示以……开头 |
$ | 表示以……结尾 |
{n} | 表示内容重复n次 |
{n,m} | 表示内容最少重复n次,最多重复m次 |
{n,} | 表示最少重复n次 |
{,m} | 表示最多重复m次 |
compile后面写正则表达式的内容,()代表从目标字符串中获取的子串;
每一个()就是一个group组。
import re
pattern = re.compile('(\d+)(\w+)')
content = '12345helloWorld'
result = re.match(pattern,content)
# 返回的是一个匹配的对象
print(result)
# 返回的是符合要求的全部内容
print(result.group(0))
# 返回的是符合要求的第一组内容
print(result.group(1))
# 返回的是符合要求的第二组内容
print(result.group(2))
输出结果为:
<_sre.SRE_Match object; span=(0, 15), match='12345helloWorld'>
12345helloWorld
12345
helloWorld
match匹配的是内容的开始部分,作用等同于startwith。
import re
pattern = re.compile('my')
result = re.match(pattern,'myself')
print(result.group(0))
result = re.match(pattern,'love myself')
print(result)
如果在开头没找到的话就会返回一个None,前面多个空格也会找不到。
输出结果为:
my
None
贪婪模式与非贪婪模式
正则表达式默认为贪婪模式,尽量找到所有的符合要求的内容。
.*称之为贪婪模式
import re
content = 'aabbababa11b222'
pattern = re.compile('(a.*b)')
result = pattern.match(content)
print(result)
输出结果为:
<_sre.SRE_Match object; span=(0, 12), match='aabbababa11b'>
.*?称之为非贪婪模式
从a开始往后,任意字符出现0次或者多次直到遇见一个b,就结束。
import re
content = 'aabbababa11b222'
pattern = re.compile('(a.*?b)')
result = pattern.match(content)
print(result)
输出结果为:
<_sre.SRE_Match object; span=(0, 3), match='aab'>
匹配到任意字符开头,后面找到一个以b开头以b结尾的内容
import re
content = 'aabbababa11b222'
pattern = re.compile('.*?(b.*?b)')
result = pattern.match(content)
print(result)
输出结果为:
<_sre.SRE_Match object; span=(0, 4), match='aabb'>
*+同为贪婪模式
* 至少0次,至多无限次
+ 至少1次,至多无限次
import re
content = 'aabbababa11b222'
pattern = re.compile('(a.+b)')
result = pattern.match(content)
print(result)
输出结果为:
<_sre.SRE_Match object; span=(0, 12), match='aabbababa11b'>
r会将字符串里面的转义字符输出出来
print('hello \n world')
print(r'hello \n world')
输出结果为;
hello
world
hello \n world
匹配连续3个数字
import re
title = '12345Hello world'
# pattern = re.compile(r'\d\d\d')
pattern = re.compile(r'\d{3}')
result = pattern.match(title)
print(result.group(0))
输出结果为:
123
匹配全国固话,比如:0371-12345678
import re
pattern = re.compile(r'(\d{4})-(\d{8})')
result = pattern.match('0371-12345678')
print(result)
print(result.group(1))
print(result.group(2))
输出结果为:
<_sre.SRE_Match object; span=(0, 13), match='0371-12345678'>
0371
12345678
| 或者;设置用于不同情况的正则
import re
pattern = re.compile('((abc|123)qwer)')
result = pattern.match('abcqwer')
print(result)
result = pattern.match('123qwer')
print(result)
输出结果为:
<_sre.SRE_Match object; span=(0, 7), match='abcqwer'>
<_sre.SRE_Match object; span=(0, 7), match='123qwer'>
search 找到字符串当中第一个符合正则的内容
注意:只找到第一个
import re
pattern = re.compile(r'http')
result = pattern.search('www.jd.com,http://www.taobao.com')
print(result)
输出结果为:
<_sre.SRE_Match object; span=(11, 15), match='http'>
import re
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'>
import re
pattern = re.compile(r'I')
result = pattern.search('I love you')
print(result)
输出结果为:
<_sre.SRE_Match object; span=(0, 1), match='I'>
findall 找到所有符合的内容
import re
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)
输出结果为:
吕布对战金轮法王,郭靖观战
import re
content = '杨过对战金轮法王,郭靖观战'
pattern = re.compile(r'杨\s*过')
result = pattern.sub('吕布',content)
pattern = re.compile(r'金轮法王')
result = pattern.sub('腹部半藏',result)
print(result)
输出结果为:
吕布对战腹部半藏,郭靖观战
import re
content = '杨过对战金轮法王,郭靖观战'
key_word = [
(r'杨过\s*','吕布'),
(r'金轮法王','服部半藏'),
(r'郭靖','东方不败')
]
for pattern,replace in key_word:
pattern = re.compile(pattern)
content = pattern.sub(replace,content)
print(content)
输出结果为:
吕布对战服部半藏,东方不败观战
匹配手机号
import re
pattern = re.compile(r'^((13[0-9])|(14[7])|(15[0-3]|15[5-9])|(16[6])|(18[0|5-9]))\d{8}$')
result = pattern.match('16666666666')
print(result)
输出结果为:
<_sre.SRE_Match object; span=(0, 11), match='16666666666'>