re模块操作
在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个模块,名字为re
使用步骤
- 使用 compile() 函数将正则表达式的字符串形式编译为一个 Pattern 对象
- 通过 Pattern 对象提供的一系列方法对文本进行匹配查找,获得匹配结果,一个 Match 对象。
- 最后使用 Match 对象提供的属性和方法获得信息,根据需要进行其他的操作
match()从起始位置开始查找,一次匹配
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
pattern = re.compile(r"http")
result = pattern.match("http://www.baidu.com")
if result:
print("以http开头")
else:
print("不是以http开头")
# 从字符串的第20个位置开始匹配
result = pattern.match("http://www.baidu.comhttp://www.qq.com", 20)
if result:
print("以http开头")
else:
print("不是以http开头")
print("匹配的内容是:", result.group(0))
print("匹配到起始位置是:", result.start(0))
print("匹配到终点位置是:", result.end(0))
print("匹配到数据的位置是:", result.span(0))
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
# 匹配 *** ***
# [a-z]表示任意一个字母
# + 表示至少一次,最多无限次
# ()表示一个group
pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I) # re.I 表示忽略大小写
m = pattern.match('Hello World Wide Web')
print(m) # 匹配成功,返回一个 Match 对象
print(m.group(0)) # 返回匹配成功的整个子串
print(m.span(0)) # 返回匹配成功的整个子串的索引
print(m.group(1)) # 返回第一个分组匹配成功的子串
print(m.span(1)) # 返回第一个分组匹配成功的子串的索引
print(m.group(2)) # 返回第二个分组匹配成功的子串
print(m.span(2)) # 返回第二个分组匹配成功的子串
print(m.groups()) # 等价于 (m.group(1), m.group(2), ...)
# print(m.group(3)) # 不存在第三个分组
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# IndexError: no such group
search()从任何位置开始查找,一次匹配
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
# \d表示匹配0-9的一个数字
pattern = re.compile(r'\d+')
m = pattern.search('one12twothree34four') # 这里如果使用 match 方法则匹配不到数据
print(m)
print(m.group())
m = pattern.search('one12twothree34four', 10, 30) # 指定字符串区间
print(m.group())
print(m.span())
sub()替换子串
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
# \w 等价于 [A-Za-z0-9],匹配任意字母和数字
p = re.compile(r'(\w+) (\w+)')
s = 'hello 123, hello 456'
print(p.sub(r'hello world', s)) # 使用 'hello world' 替换 'hello 123' 和 'hello 456'
print(p.sub(r'\2 \1', s)) # 引用分组
def func(m):
return 'hi' + ' ' + m.group(2)
print(p.sub(func, s))
print(p.sub(func, s, 1)) # 最多替换一次
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
bad_words = [
(r'毛\s*泽\s*东', '毛*东'),
(r'江\s*泽\s*民', '江*民'),
(r'胡\s*锦\s*涛', '胡*涛'),
]
content = "毛 泽 东带领江泽民指导胡锦涛学习Python"
for bad_word in bad_words:
pattern = re.compile(bad_word[0])
content = pattern.sub(bad_word[1], content)
print(content)
split()分割字符串
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
p = re.compile(r'[\s\,\;]+')
print(p.split('a,b;; c d'))
p = re.compile(r'[\-万月/]+')
print(p.split('1.2-1.8万/月'))
finditer()全部匹配,返回迭代器
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
pattern = re.compile(r'\d+')
result_iter1 = pattern.finditer('hello 123456 789')
print(type(result_iter1))
for m1 in result_iter1: # m1 是 Match 对象
print('------matching string: {}, position: {}'.format(m1.group(), m1.span()))
result_iter2 = pattern.finditer('one1two2three3four4', 0, 10)
print(type(result_iter2))
for m2 in result_iter2:
print('======matching string: {}, position: {}'.format(m2.group(), m2.span()))
findall()全部匹配,返回列表
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
pattern = re.compile(r'\d+') # 查找数字
result1 = pattern.findall('hello 123456 789')
result2 = pattern.findall('one1two2three3four4', 0, 10)
print(result1)
print(result2)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
import requests
pattern = re.compile(r"""<img src="(.*?)".*?/>""")
content = requests.get("http://www.27270.com/zt/zrfg/").text
result = pattern.findall(content)
for src in result:
print(src)
匹配邮箱
# -*- coding:utf-8 -*-
import re
pattern = re.compile(r'^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$')
result = pattern.match("[email protected]")
if result:
print "是邮箱"
else:
print "不是邮箱"
匹配手机
# -*- coding:utf-8 -*-
import re
pattern = re.compile(r'^(0|86|17951)?(13[0-9]|15[012356789]|18[0-9]|14[57])[0-9]{8}$')
result = pattern.match("13563746534")
if result:
print "是手机号"
else:
print "不是手机号"
匹配密码强度
# -*- coding:utf-8 -*-
import re
def checklen(pwd):
return len(pwd)>=8
def checkContainUpper(pwd):
pattern = re.compile('[A-Z]+')
match = pattern.findall(pwd)
if match:
return True
else:
return False
def checkContainNum(pwd):
pattern = re.compile('[0-9]+')
match = pattern.findall(pwd)
if match:
return True
else:
return False
def checkContainLower(pwd):
pattern = re.compile('[a-z]+')
match = pattern.findall(pwd)
if match:
return True
else:
return False
def checkSymbol(pwd):
pattern = re.compile('([^a-z0-9A-Z])+')
match = pattern.findall(pwd)
if match:
return True
else:
return False
def checkPassword(pwd):
# 判断密码长度是否合法
lenOK=checklen(pwd)
# 判断是否包含大写字母
upperOK=checkContainUpper(pwd)
# 判断是否包含小写字母
lowerOK=checkContainLower(pwd)
# 判断是否包含数字
numOK=checkContainNum(pwd)
# 判断是否包含符号
symbolOK=checkSymbol(pwd)
print(lenOK)
print(upperOK)
print(lowerOK)
print(numOK)
print(symbolOK)
return (lenOK and upperOK and lowerOK and numOK and symbolOK)
def main():
if checkPassword('Helloworld#123'):
print('检测通过')
else:
print('检测未通过')
if __name__ == '__main__':
main()
匹配中文
# -*- coding:utf-8 -*-
import re
title = u'你好,hello,世界 我是谁 啊'
pattern = re.compile(ur'[\u4e00-\u9fa5]+')
result = pattern.findall(title)
for word in result:
print word
去除网页中除了src以外的所有标签属性
# -*- coding: utf-8 -*-
import re
with open("1.txt", "r") as f1:
content = f1.read()
pattern = re.compile(r"""\b(?!(?:href|src))\w+=(["\']).+?\1""", re.I)
result = pattern.sub("", content)
result = result.replace(" >", ">")
with open("2.txt", "w") as f2:
f2.write(result)
贪婪模式和非贪婪模式(笔试题常考)
- 贪婪模式:在整个表达式匹配成功的前提下,尽可能多的匹配 ( * );
- 非贪婪模式:在整个表达式匹配成功的前提下,尽可能少的匹配 ( ? );
- Python里数量词默认是贪婪的。