一、正则表达式
认识正则表达式
正则表达式是一个特殊的字符序列,便于检查字符串是否与某种模式匹配,正则表达式也是对字符串的处理,通过定义一个规则,使得从字符串中匹配出符合规则的字符串,正则表达式可以:
- 判断一个字符串是否符合规则,如手机号邮箱判断等
- 取出指定数据
- 匹配指定格式的信息
正则表达式通用性强,可适用于很多编程语言。
正则表达式匹配字符
正则表达式匹配字符串需要的条件:
- re模块
- 匹配规则
- 匹配范围,既从哪个字符串中尽心匹配
正则表达式中的特殊字符:
特殊字符 | 描述 |
\d | 匹配任何十进制的数字,与[0-9]一致 |
\D | 匹配任意非数字 |
\w | 匹配任何字母数字下划线字符 |
\W | 匹非字母数字以及下划线 |
\s | 匹配任何空格字符,与[\n\t\r\v\f]相同 |
\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('old\Z', data))) print('匹配任何字符:{}'.format(re.findall('.', data))) 复制代码
使用正则表达式定义函数,操作字符串。
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 函数
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]) 复制代码