Hello,大家好呀,我们今天的目标是,30 分钟内明白正则表达式是什么,并对它有一些基本的了解,并且在自己的程序或网页里使用它。本文全程实操,只要跟着练,你一定会有收获。好课推荐:正则表达式浅析;实战推荐:正则表达式
一、单字符匹配
1、匹配某个字符串:
text = "abcdef"
ret = re.match('a',text)
print(ret.group())
2、点(.):匹配任意的字符(除了'\n'):
text = "\nabcdef"
ret = re.match('.',text)
print(ret.group())
3、\d:匹配任意的数字:
text = "abcdef"
ret = re.match('\d',text)
print(ret.group())
4、\D:匹配任意的非数字:
text = "cabedf"
ret = re.match('\D',text)
print(ret.group())
5、\s:匹配的是空白字符(包括:\n,\t,\r和空格):
text = "\nabdef"
ret = re.match('\s',text)
print("*"*30)
print(ret.group())
print("*"*30)
6、\S:非空白字符:
text = "ababdef"
ret = re.match('\S',text)
print("*"*30)
print(ret.group())
print("*"*30)
7、\w:匹配的是a-z和A-Z以及数字和下划线:
text = "1bc"
ret = re.match('\w',text)
print("*"*30)
print(ret.group())
print("*"*30)
8、\W:匹配的是和\w相反的:
text = "+bc"
ret = re.match('\W',text)
print("*"*30)
print(ret.group())
print("*"*30)
9、[] 组合的方式,只要满足中括号中的某一项都算匹配成功:
text = "cba"
ret = re.match('[1c]',text)
print("*"*30)
print(ret.group())
print("*"*30)
10、使用组合的方式 [0-9] \d:
text = "abc"
ret = re.match('[^0-9]',text) # ^符号表示非
print("="*30)
print(ret.group())
print("="*30)
11、使用组合的方式实现 \w:
text = "+bc"
ret = re.match('[^a-zA-Z0-9_]',text)
print("="*30)
print(ret.group())
print("="*30)
二、多字符匹配
1、*:匹配 0 个或者多个字符:
text = "-cba"
result = re.match('\D*',text)
print(result.group())
2、+:匹配 1 个或者多个字符:
text = "1cba"
result = re.match('\w+',text)
print(result.group())
3、?:匹配前一个字符 0 个或者 1 个:
text = "-cba"
result = re.match('\w?',text)
print(result.group())
4、{m}:匹配 m 个字符:
text = "+1cba"
result = re.match('\w{2}',text)
print(result.group())
5、{m,n}:匹配 m-n 之间的个数的字符:
text = "1cba+"
result = re.match('\w{1,3}',text)
print(result.group())
三、正则表达式案例
1、验证手机号码:手机号码的规则是以 1 为开头,第二位可以是 34587,后面那 9 位可为任意数字。
text = "17751632549"
result = re.match("1[34587]\d{9}",text)
print(result.group())
2、验证邮箱:邮箱的规则是邮箱名称是用数字、英文字符、下划线组成的,然后是 @ 符号,接着为域名。
text = "w3cschool@163.com"
result = re.match("\w+@[a-z0-9]+\.[a-z]+",text)
print(result.group())
3、验证 URL:URL 的规则是前面是 http 或者 https 或者是 ftp 然后再加上一个冒号,再加上两个斜杠,再后面就是可以出现任意非空白字符了。
text = "https://www.w3cschool.cn/minicourse/play/quick_scrapy"
result = re.match("(http|https|ftp)://\S+",text)
print(result.group())
4、验证身份证:身份证的规则是,总共有 18 位,前面 17 位都是数字,后面一位可以是数字,也可以是小写的 x,也可以是大写的 X。
text = "35215669985213654x"
result = re.match("\d{17}[\dxX]",text)
print(result.group())
四、开始/结束/贪婪和非贪婪
1、^:以...开头:
text = "hello world"
result = re.search("^world",text)
print(result.group())
2、$:以...结尾:
text = "hello world"
result = re.search("hello$",text)
print(result.group())
text = ""
result = re.search("^$",text)
print(result.group())
3、|:匹配多个字符串或者表达式:
text = "https://www.w3cschool.cn/minicourse/play/quick_scrapy"
result = re.match("(http|https|ftp)://\S+",text)
print(result.group())
4、贪婪和非贪婪:
text = "12345"
result = re.search("\d+?",text)
print(result.group())
案例 1:提取 html 标签名称:
text = "<h1>这是一级标题</h1>"
result = re.search("<.+?>",text)
print(result.group())
案例 2:验证一个字符是不是 0-100 之间的数字:
text = "100"
result = re.match("0$|[1-9]\d?$|100$",text)
print(result.group())
四、转义字符和原生字符串
1、Python 中的转义字符:
text = r"hello\nw3cschool"
print(text)
2、正则表达式中的转义字符:
text = "apple price is $9.9,range price is $8.8"
result = re.findall("\$\d+",text)
print(result)
3、原生字符串和正则表达式:
正则表达式的字符串解析规则:
- 先把这个字符串放在 Python 语言层面进行解析。
- 把 Python 语言层面解析的结果再放到正则表达式层间进行解析。
text = "\cba c"
result = re.match("\\\\c",text) # \\\\c =(Python语言层面)> \\c =(正则表达式层面)> \c
result = re.match(r"\\c",text) # \\c =(正则表达式层面)> \c
print(result.group())
五、分组
text = "apple price is $9.9,orange price is $8.8"
result = re.search('.+(\$\d+).+(\$\d+)',text)
print(result.groups())
group()/group(0):匹配整个分组
group(1):匹配第一个分组
group(2):匹配第二个分组
groups():获取所有的分组
六、re 中常用的函数
1、findall:查找所有满足条件的
text = "apple price is $9.9,orange price is $8.8"
result = re.findall(r'\$\d+',text)
print(result)
2、sub:根据规则替换其他字符串
text = "nihao zhongguo,hello w3cschool"
new_text = text.replace(" ","\n")
new_text = re.sub(r' |,','\n',text)
print(new_text)
html = """
<div class="job-detail">
<p>1. 3年以上相关开发经验 ,全日制统招本科以上学历</p>
<p>2. 精通一门或多门开发语言(Python,C,Java等),其中至少有一门有3年以上使用经验</p>
<p>3. 熟练使用ES/mysql/mongodb/redis等数据库;</p>
<p>4. 熟练使用django、tornado等web框架,具备独立开发 Python/Java 后端开发经验;</p>
<p>5. 熟悉 Linux / Unix 操作系统 </p>
<p>6. 熟悉 TCP/IP,http等网络协议</p>
<p>福利:</p>
<p>1、入职购买六险一金(一档医疗+公司全额购买商业险)+开门红+全额年终奖(1年13薪,一般会比一个月高)</p>
<p>2、入职满一年有2次调薪调级机会</p>
<p>3、项目稳定、团队稳定性高,团队氛围非常好(汇合员工占招行总员工比例接近50%);</p>
<p>4、有机会转为招商银行内部员工;</p>
<p>5、团队每月有自己的活动经费,法定节假日放假安排;</p>
<p>6、办公环境优良,加班有加班费(全额工资为计算基数,加班不超过晚上10点,平日加班为时薪1.5倍,周末加班为日薪2倍,周末加班也可优先选择调休,管理人性化)。</p>
</div>
"""
new_html = re.sub(r'<.+?>',"",html)
print(new_html)
3、split:根据规则分割字符串
text = "nihao zhongguo,hello world"
result = re.split(r' |,',text)
print(result)
4、compile:编译正则表达式
text = "apple price is 34.56"
r = re.compile(r"""
\d+ # 整数部分
\.? # 小数点
\d* # 小数部分
""",re.VERBOSE)
result = re.search(r,text)
result = re.search(r"""
\d+ # 整数部分
\.? # 小数点
\d* # 小数部分
""",text,re.VERBOSE)
print(result.group())
如果想要在正则表达式中加注释,那么需要在正则表达式的函数最后加一个`re.VERBOSE`。