第63天:正则表达式

简介: 第63天:正则表达式

正则表达式是一个特殊的字符串序列、一种模式,用来判断字符串是否符合这种模式,如:判断邮件地址是否有 @ 符号,判断手机号是否正确等待。

基本语法

在正则表达式中,可以使用 \d 匹配数字,\w 匹配数字和子母,. 可以匹配除了换行符之外的任意字符,\s 匹配空白字符


1\d 可以匹配 1213


a\w 可以匹配 abac


.abc 可以匹配 aabc~abcabc


上面是单个字符匹配,要匹配长字符串在正则表达式中,用 + 表示匹配至少一个字符,用 ? 表示匹配0或1个字符,用 {n} 表示匹配n个字符,用 {n,m} 表示匹配n-m个字符

test.+ 可以匹配 testPythontestPy,无法匹配 test


test? 可以匹配 testest,无法匹配 testPython


test.{6} 可以匹配 testPython,无法匹配 testPy


test.{1,6} 可以匹配 testPythontestPy,无法匹配 test

复杂的正则

正则表达式可以更加的复杂:([A-Za-z0-9_\-\.]+)\@([A-Za-z0-9_\-\.]+)\.([A-Za-z]{2,4})


( ):表示分组


[ ]:表示在[ ]内的任意一个字符


([A-Za-z0-9_-.]+):表示以大写字母 [A-Z]、小写字母 [a-z]、数字 [0-9]、下划线 [_]、减号 [-]、点号 [.] 中的至少一个字符 [+] ,在正则表达式中减号 [-] 和点号 [.] 是特殊字符需要使用 [] 转义


@:邮件中的@符号


([A-Za-z0-9_-.]+):表示以大写字母 [A-Z]、小写字母 [a-z]、数字 [0-9]、下划线 [_]、减号 [-]、点号 [.] 中的至少一个字符 [+],如:qq,sina


.([A-Za-z]{2,4}):表示以点号 [.] 连接2-4 [{2,4}] 个字符的大写字母 [A-Z] 和小写字母 [a-z]


([A-Za-z0-9_\-\.]+)\@([A-Za-z0-9_\-\.]+)\.([A-Za-z]{2,4})可以匹配 abc@qq.comABCabc1234@qq.comabc_123-xyz@sina.cn

Python中的正则表达式

匹配


在Python中提供了包含了所有正则表达式功能的 re 模块,用 re 中的match()函数判断是否匹配成功,如果匹配成功则返回 Match 对象,否则返回 None ,在 Python 中字符串用 \ 转义,使用 r 前缀可以不用考虑转义的问题


>>> import re>>> re.match(r'1\d', '13')<re.Match object; span=(0, 2), match='13'>   # 匹配成功返回Match对象>>> re.match(r'1\d', '23') # 匹配失败返回None>>>


分组


在爬虫中一般需要提取出匹配成功的子字符串。用 ( ) 分组就可以提取出子字符串比如上面的邮件正则表达式,在Python中使用 Match 对象的 group() 函数提取出子字符串,groups() 函数返回所有子字符串的元组


([A-Za-z0-9_\-\.]+)\@([A-Za-z0-9_\-\.]+)\.([A-Za-z]{2,4}) 定义了3个组,可以提取出 @ 符之前的字符串和域名



>>> email = re.match(r'([A-Za-z0-9_\-\.]+)\@([A-Za-z0-9_\-\.]+)\.([A-Za-z]{2,4})', 'abc@qq.com')>>> email.group(0)'abc@qq.com'>>> email.group(1)'abc'>>> email.group(2)'qq'>>> email.group(3)'com'


group() 函数中group(0)永远是字符串本身,group(1)group(2)group(3) ...表示第一、第二、第三...个子字符串。


替换


re 模块中提供了 sub() 函数替换子字符串的内容


# 删除字符串中的空格>>> test = '021- 1101101 10'>>> re.sub(r'\s','',test)'021-110110110'

sub() 函数中被替换的字符串也可以使用函数


import re
# 把数字加上100def num(match):    value = int(match.group('num'))    return str(value + 100)
test = 'abc12defg980'result = re.sub(r'(?P<num>\d+)', num, test)print(result)


编译


在使用 re 模块的时候,Python 帮我们做了两件事:


  1. 编译正则表达式,如果正则表示不合法会报错
  2. 用编译后的正则表示匹配字符串

re 模块中可以使用 compile() 函数预编译正则表示


>>> import re>>> test = re.compile(r'test(.{1,6})')>>> test.match('testPy').groups()('Py',)>>> test.match('testPython').groups()('Python',)


compile() 函数构造出来的是一个 Pattern 对象。提供了一些属性读取正则表达的相关信息。


  1. pattern:编译的正则表达式
  2. groups:表达式中的分组数量
  3. flags:编译时的匹配模式


>>> test = re.compile(r'test(.{1,6})')>>> test.pattern'test(.{1,6})'>>> test.groups1>>> test.flags32

总结

正则表达式非常的强大,这里只介绍了它的一小部分内容,让大家对正则表达式的概念和使用有一个清晰的了解。


示例代码:https://github.com/JustDoPython/python-100-day/tree/master/day-063


系列文章


第62天:HTTP 入门第61天:Python Requests 库高级用法从 0 学习 Python 0 - 60 大合集总结


PS:公号内回复 :Python,即可进入Python 新手学习交流群,一起100天计划!

目录
相关文章
|
6月前
常用正则表达式 (必备)
常用正则表达式 (必备)
|
3月前
|
XML 前端开发 数据安全/隐私保护
常用正则表达式
常用正则表达式
|
数据安全/隐私保护
正则表达式大全
正则表达式
71 3
|
前端开发 JavaScript Java
正则表达式(极其适合零基础)
正则表达式(极其适合零基础)
153 0
正则表达式(极其适合零基础)
|
数据采集 机器学习/深度学习 移动开发
我学会了,正则表达式
爬虫是**非常的**的强大,相信不少朋友都有所耳闻,它帮助我们更快地“获得”我们所要关键数据。那么,它怎么知道我们要需要什么内容?它又是如何工作的?在这篇文章里,我们一起来看看。
104 0
我学会了,正则表达式
|
测试技术 C# Python