Python3-正则表达式

How to use Regex

当我们在 Python 中使用正则表达式时,re 模块内部会干两件事情:

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

注意:

  • 若一个正则表达式要用好多次,我们可以预编译该正则表达式,此时就要用到re模块里的compile函数。
  • 在正则表达式前面加上r就无需考虑转义的问题。

re中得常用函数
re中常用函数用法
re.compile(pattern,flags = 0 )编译一个正则表达式模式为正则表达式对象,可使用匹配方法
re.search(pattern,string,flags = 0)扫描字符串,查找正则表达式模式生成匹配项的第一个位置 ,并返回相应的匹配对象
re.match(pattern,string,flags = 0 )如果字符串开头的零个或多个字符与正则表达式模式匹配,则返回相应的匹配对象
re.split(pattern,string,maxsplit = 0,flags = 0 )按模式的出现拆分字符串。如果在模式中使用捕获括号,则模式中所有组的文本也将作为结果列表的一部分返回
re.findall(pattern,string,flags = 0 )返回的所有非重叠的匹配模式的字符串,如字符串列表
re.sub(pattern, repl, string, count=0)替换字符串中的匹配项;repl为替换的字符串,count 为替换的最大次数,默认0替换所有匹配
参数flags为标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

正则表达式模式
模式描述
\w匹配字母、数字及下划线
\W\w的反义
\s匹配任意空白字符,等价于[\t\n\r\f]
\S\s的反义
\d匹配任意数字,等价于[0-9]
\D\d的反义
\A匹配字符串开头
\Z匹配字符串结尾,如果存在换行,只匹配到换行前的结束字符串
\z匹配字符串结尾,如果存在换行,同时还会匹配换行符
\G匹配最后匹配完成的位置
\n匹配一个换行符
\t匹配一个制表符
^匹配一行字符串的开头
$匹配一行字符串的结尾
.匹配任意字符,出了换行符
[…]匹配其中的字符
[^…]匹配除里面之外的字符
*匹配0或多个表达式
+匹配1或多个表达式
?匹配0个或1个其前面表达式定义的片断
{n}匹配n次其前面的表达式
{n,m}匹配n到m次由前面表达式定义的片段
a|b匹配a或b
()匹配括号内的表达式

常用函数的用法
import re

string = "hello,i am learning how to use Regex"

print('\n-----匹配字符串-----\n')
print(re.match(r'learn',string))    #只匹配开头
print(re.search(r'learn',string))   #全局搜索
print(re.findall(r'o',string))      #匹配所有,返回一个列表


print('\n-----先编译一个正则表达式,再进行匹配-----\n')
pattern = re.compile(r'learn')  #编译一个正则表达式
print(pattern.match(string))
print(pattern.search(string))

m = pattern.search(string)
print(m.span())        #返回一个元祖(开始,结束)的位置
print(m.group())       #返回正则匹配的字符串
print(m.start())       #返回匹配开始的位置(第一位从0开始)
print(m.end())         #返回匹配结束的位置

print('-----利用正则分隔字符串-----')
print(re.split(r'\s',string))           #按空格分隔,返回一个列表

运行结果
-----匹配字符串-----

None
<_sre.SRE_Match object; span=(11, 16), match='learn'>
['o', 'o', 'o']

-----先编译一个正则表达式,再进行匹配-----

None
<_sre.SRE_Match object; span=(11, 16), match='learn'>
(11, 16)
learn
11
16
-----利用正则分隔字符串-----
['hello,i', 'am', 'learning', 'how', 'to', 'use', 'Regex']

小小示例
import re
# 采用拉勾网部分源码
string = '''<a href="https://www.lagou.com/zhaopin/Java/" data-lg-tj-id="4A00" data-lg-tj-no="0001" data-lg-tj-cid="idnull">Java</a>
            <a href="https://www.lagou.com/zhaopin/PHP/" data-lg-tj-id="4A00" data-lg-tj-no="0002" data-lg-tj-cid="idnull">PHP</a>                   
            <a href="https://www.lagou.com/zhaopin/C++/" data-lg-tj-id="4A00" data-lg-tj-no="0003" data-lg-tj-cid="idnull">C++</a>                     
            <a href="https://www.lagou.com/zhaopin/qukuailian/" data-lg-tj-id="4A00" data-lg-tj-no="0004" data-lg-tj-cid="idnull">区块链</a>                     
            <a href="https://www.lagou.com/zhaopin/Android/" data-lg-tj-id="4A00" data-lg-tj-no="0005" data-lg-tj-cid="idnull">Android</a>                          
            <a href="https://www.lagou.com/zhaopin/iOS/" data-lg-tj-id="4A00" data-lg-tj-no="0006" data-lg-tj-cid="idnull">iOS</a>                          
            <a href="https://www.lagou.com/zhaopin/shujuwajue/" data-lg-tj-id="4A00" data-lg-tj-no="0007" data-lg-tj-cid="idnull">数据挖掘</a>  
            <a href="https://www.lagou.com/zhaopin/shenduxuexi/" data-lg-tj-id="4A00" data-lg-tj-no="0008" data-lg-tj-cid="idnull">深度学习</a>   
            <a href="https://www.lagou.com/zhaopin/ziranyuyanchuli/" data-lg-tj-id="4A00" data-lg-tj-no="0009" data-lg-tj-cid="idnull">自然语言处理</a> 
            <a href="https://www.lagou.com/zhaopin/jiqixuexi/" data-lg-tj-id="4A00" data-lg-tj-no="0010" data-lg-tj-cid="idnull">机器学习</a>  
            <a href="https://www.lagou.com/zhaopin/ceshi/" data-lg-tj-id="4A00" data-lg-tj-no="0011" data-lg-tj-cid="idnull">测试</a>    
            <a href="https://www.lagou.com/zhaopin/html51/" data-lg-tj-id="4A00" data-lg-tj-no="0012" data-lg-tj-cid="idnull">html5</a>    
            <a href="https://www.lagou.com/zhaopin/jishuzongjian/" data-lg-tj-id="4A00" data-lg-tj-no="0013" data-lg-tj-cid="idnull">技术总监</a> 
            <a href="https://www.lagou.com/zhaopin/jiagoushi/" data-lg-tj-id="4A00" data-lg-tj-no="0014" data-lg-tj-cid="idnull">架构师</a>    
            <a href="https://www.lagou.com/zhaopin/CTO/" data-lg-tj-id="4A00" data-lg-tj-no="0015" data-lg-tj-cid="idnull">CTO</a>  '''

print("-----------匹配所有的中文------------------------")
pattern1 = re.compile(r'[\u4e00-\u9fa5]') #unicode
print(re.findall(pattern1,string))

print("-----------匹配其中的职位------------------------")
pattern2 = re.compile(r'>.*?<')
position = re.findall(pattern2,string)
for p in position:
    print(re.sub(r'>|<',"",p))             #用替换函数sub去除多余的字符

print("-----------匹配其中的链接------------------------")
pattern3 = re.compile(r'http.*?"')         # 在这里,也可以用 r'[a-zA-z]+://[^\s]*'
urls = re.findall(pattern3,string)
for url in urls:
    print(url)

运行结果
-----------匹配所有的中文------------------------
['区', '块', '链', '数', '据', '挖', '掘', '深', '度', '学', '习', '自', '然', '语', '言', '处', '理', '机', '器', '学', '习', '测', '试', '技', '术', '总', '监', '架', '构', '师']
-----------匹配其中的职位------------------------
Java
PHP
C++
区块链
Android
iOS
数据挖掘
深度学习
自然语言处理
机器学习
测试
html5
技术总监
架构师
CTO
-----------匹配其中的链接------------------------
https://www.lagou.com/zhaopin/Java/"
https://www.lagou.com/zhaopin/PHP/"
https://www.lagou.com/zhaopin/C++/"
https://www.lagou.com/zhaopin/qukuailian/"
https://www.lagou.com/zhaopin/Android/"
https://www.lagou.com/zhaopin/iOS/"
https://www.lagou.com/zhaopin/shujuwajue/"
https://www.lagou.com/zhaopin/shenduxuexi/"
https://www.lagou.com/zhaopin/ziranyuyanchuli/"
https://www.lagou.com/zhaopin/jiqixuexi/"
https://www.lagou.com/zhaopin/ceshi/"
https://www.lagou.com/zhaopin/html51/"
https://www.lagou.com/zhaopin/jishuzongjian/"
https://www.lagou.com/zhaopin/jiagoushi/"
https://www.lagou.com/zhaopin/CTO/"

re模块文档:https://docs.python.org/3.6/library/re.html#re.compile

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值