正则表达式可以判断目标字符串是否符合特定的要求。
正则表达式大致的匹配过程是,首先拿出表达式和文本中的内容进行比较,如果每一个字符都能匹配,则匹配成功,一旦有匹配不成功的字符,则匹配失败。
预定义字符集(可以写在字符集[..]中):
\d 表示任意的一位数字 digit
\d\d 表示任意的两位数字
\D 表示非数字 [^\d]
\w 表示任意的字母和数字 word
\s 表示空格 space
\S 表示非空白字符 [^\s]
数量词:用在字符或者(..)之后
. : 表示任意的内容,1,2,3,a,b,c !@$
不单独使用,经常跟在字符串后面
a. 在a后面匹配任意的内容, ab,a1,a2,a4
* :表示内容出现0次或者多次
a.* 表示 a ab aaaaa abbbbb
+ : 表示内容出现1次到多次
a.+ aa ab ac ad av
? :表示内容出现0次或者1次
a.? a a1 a2
g? '' 'g'
^ : 表示以....开头
$ : 表示以....结尾
{n} : 表示内容重复n次
·\d\d\d \d{3}
{n,m} : 最少重复n次,最多重复m次
\d{3,5}
{n,} 表示最少重复n次
{,m} 表示最多重复m次
1. match
match 的用法:match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match就会返回None
pattern = re.compile('(\d+)(\w+)')
content = '123hellowrold'
result = re.match(pattern, content)
print(result.group(0))
# 123hellowrold
# group(0) 是输出所有的。
# group(1) 是输出第一个括号里面的。
pattern = re.compile('my')
result = re.match(pattern, 'myself')
print(result.group(0))
# my
# 在group里写不写0都是输出my,
# 但是写 1 就会报错
# match 匹配的是内容开始的部分,跟字符串里面的startswith很像
pattern = re.compile('my')
result = re.match(pattern, 'love myself')
print(result)
# 输出: None
2 贪婪匹配与非贪婪匹配
正则表达式默认是贪婪匹配:尽量找到所有符合的要求
.* 称之为贪婪模式
content = 'cdcdccddddcc121'
pattern = re.compile('(c.*d)')
result = re.match(pattern, content)
print(result.group())
# 输出:cdcdccdddd
.*? 称之为非贪婪模式
# content = 'cdcdccddddcc121'
# 从c开始往后找,找到第一d就结束
pattern = re.compile('(c.*?d)') # 这里加不加括号,下面都要写group
result = re.match(pattern, content)
print(result.group())
# 输出: cd
# .*(b.*?b) 这个表示的是:匹配任意字符开头,后面找一个以b开头以b结尾的内容
print('hello \n \world')
# raw string 会将字符串里面的转义字符输出出来
print(r'hello \n world')
# 匹配全国固话 0371-66668888
pattern = re.compile(r'(\d{4}-\d{8})')
result = pattern.match('0371-88886666')
print(result.group())
# 输出:0371-88886666
# | 表示或者,设置用于不同情况的正则
pattern = re.compile(r'((haha|heihie)|balabala)')
result = re.match(pattern, 'hahabalabala')
print(result.group())
# 输出 haha
3 search 与 findall
# search 找到字符串当中第一个符合正则的内容
# 注意,只找第一个。
pattern = re.compile(r'you')
result = re.search(pattern, 'I love you I hate you')
print(result.group())
# 输出:you
#
# 这个写的比上面的能稍微简单一点
pattern = re.compile(r'you')
result = pattern.search('I miss you I lilke you')
print(result.group())
# findall 找出所有符合的内容
content = '12345,上山打老虎,老虎没打着,打只小松鼠,55555'
pattern = re.compile(r'(\d{5})')
result = pattern.findall(content)
print(result)
# ['12345', '55555']
4 sub 的简单认识
假如输入的字符串是’hello 111 world 111’,
可以通过str.replace(‘111’, ‘222’) 来实现
但是 如果字符串是’hello 123 world 456’,就不能用replace来实现
这时就需要re.sub了
# sub 替换子串
content = '杨 过对战金轮法王,郭靖观战'
pattern = re.compile(r'(杨\s*过)')
# 这里的第一个参数表示替换后的,第二个参数表示要替换的字符串
result = pattern.sub('吕布', content)
print(result)
# 输出:吕布对战金轮法王,郭靖观战
pattern = re.compile(r'金轮法王')
result = pattern.sub('服部半藏', result)
print(result)
# 输出:吕布对战金轮法王,郭靖观战
content = '杨 过对战金轮法王,郭靖观战'
key_word = [
(r'杨\s*过', '吕布'),
(r'金轮法王', '服部半藏'),
(r'郭靖', '东方不败')
]
for pattern, replace in key_word:
#print(pattern)
# 杨\s*过
#金轮法王
#郭靖
pattern = re.compile(pattern) # 这句话表示的要替换的子串
content = pattern.sub(replace, content)
print(content)
# 吕布对战服部半藏,东方不败观战