一、正则表达式
认识正则表达式
正则表达式是一个特殊的字符序列,便于检查字符串是否与某种模式匹配,正则表达式也是对字符串的处理,通过定义一个规则,使得从字符串中匹配出符合规则的字符串,正则表达式可以
- 判断一个字符串是否符合规则,如手机号邮箱判断等
- 取出指定数据
- 匹配指定格式的信息
正则表达式通用性强,可适用于很多编程语言
正则表达式匹配字符
正则表达式匹配字符串需要的条件:
- re模块
- 匹配规则
- 匹配范围,既从哪个字符串中尽心匹配
正则表达式中的特殊字符
特殊字符 | 描述 |
---|---|
d | 匹配任何十进制的数字,与[0-9]一致 |
D | 匹配任意非数字 |
w | 匹配任何字母数字下划线字符 |
W | 匹非字母数字以及下划线 |
s | 匹配任何空格字符,与[ntrvf]相同 |
S | 匹配任意非空字符 |
A | 匹配字符串的起始 |
Z | 匹配字符串的结束I |
. | 匹配任何字符,除n之外 |
import re
data = 'I am Thor Odinson, 1500 years old'
print('匹配到的数字为:{}'.format(re.findall('d', data)))
print('匹配到的空格为:{}'.format(re.findall('s', data)))
print('匹配到的字符为:{}'.format(re.findall('w', data)))
print('匹配起始字符串:{}'.format(re.findall('AI am', data)))
print('匹配末尾字符串:{}'.format(re.findall('oldZ', data)))
print('匹配任何字符:{}'.format(re.findall('.', data)))
使用正则表达式定义函数,操作字符串
代码语言:javascript复制import re
def contain_num(data):
res = re.findall('d', data)
if len(res) > 0:
return True
return False
def delete_num(data):
# 匹配出非数字
res = re.findall('D', data)
return ''.join(res)
if __name__ == '__main__':
data = '95 Anzan Hwy, Ashforad SA 5035 Adelaide'
contain = contain_num(data)
print(contain)
_data = delete_num(data)
print(_data)
使用正则表达式实现startwith函数和endwith函数
代码语言:javascript复制import re
def starts_with(start, data):
# 构造正则表达式
_start = 'A%s' % start
res = re.findall(_start, data)
if len(res) > 0:
return True
return False
def ends_with(end, data):
_end = '{}Z'.format(end)
res = re.findall(_end, data)
if len(res) > 0:
return True
return False
if __name__ == '__main__':
data = '13 Ramel Way, Pakenham VIC'
res_01 = starts_with('13', data)
res_02 = starts_with('afeae', data)
res_03 = ends_with('VIC', data)
print(res_01)
print(res_02)
print(res_03)
二、正则表达式的量词与组
正则表达式中的符号
- |:或的意思,re1|re2表示匹配表达式1或者表达式2
- ^:匹配字符串的开头
- $:匹配字符串的结尾
- *:匹配0次或者多次前面出现的正则表达式
- :匹配1次或者多次前面出现的正则表达式
- {N}:匹配N次前面出现的正则表达式
- {M,N}:匹配M~N次前面出现的正则表达式
- [...]:匹配来自字符集的任意单一字符
- [x-y]:匹配x~y范围内的单一字符
- [^..]:不匹配此字符集中出现的任何一个字符,包括某一范围内的字符
- :将特殊字符转义
正则表达式中()表示在匹配规则中获取指定的数据
贪婪与贪婪,0或者多次属于贪婪模式,可以通过?组合变成非贪婪模式
三、正则表达式模块
正则表达式模块的常用方法有:
方法     | 描述 |
---|---|
findall(pattern, string[,flags]) | 查找字符串中所有非重复出现的正则表达式模式,返回一个列表 |
search(pattern, string, flags=0) | 使用可选标记搜索字符串中第一次出现的正则表达式模式,如果匹配成功返回匹配对象,否则返回None |
group(num) | 返回整个匹配对象,或者编号为num的特定子组 |
groups() | 返回一个包含所有匹配子组的元素,如果没有成功匹配,返回一个空元祖 |
split(pattern, string, max=0) | 根据正则表达式的模式分隔符,split函数可以将字符串分割为列表,然后返回成功匹配的列表,分割最多操作max次 |
match(pattern, string, flags=0) | 尝试使用带有可选标记的正则表达式的模式来匹配字符串,匹配成功返回匹配对象,否则返回None |
complie(pattern, flags=0) | 定义一个匹配规则的对象 |
import re
def identity(url):
re_obj = re.compile('[a-zA-Z]{4,5}://w*.*w .w ')
print(re_obj)
res = re_obj.findall(url)
if len(res) != 0:
return True
return False
def get_url(url):
re_obj = re.compile('[https://|http://](w*.*w .w )')
res = re_obj.findall(url)
if len(res) != 0:
return res[0]
else:
return False
def get_email(email):
re_obj = re.compile('. @. .[a-zA-Z] ')
res = re_obj.findall(email)
return res
def get_html_data(data):
re_obj = re.compile('style="(.*?)"')
res = re_obj.findall(data)
return res
def get_all_data_html(data):
re_obj = re.compile('="(. ?)"')
res = re_obj.findall(data)
return res
if __name__ == '__main__':
result = identity('http://www.baidu.com/')
print(result)
result = get_url('https://www.baidu.com/')
print(result)
result = get_email('thor@asgard.com')
print(result)
html = ('<div class="s-top-nav" style="display:none;">'
'</div><div class="s-center-box"></div>')
result = get_html_data(html)
print(result)
result = get_all_data_html(html)
print(result)
re_g = re.compile(('<div class="(.*?)" style="(.*?)">'
'</div><div class="(.*?)"></div>'))
result = re_g.search(html)
print(result.groups())
print(result.group(1))
print(result.group(2))
print(result.group(3))
# print(result.group(4))
re_g = re.compile('s')
result = re_g.split(html)
print(result)
re_g = re.compile('<div class="(.*?)"')
result = re_g.match(html)
print(result.span())
print(html[: 22])