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 = '''Java
            PHP                   
            C++                     
            区块链                     
            Android                          
            iOS                          
            数据挖掘  
            深度学习   
            自然语言处理 
            机器学习  
            测试    
            html5    
            技术总监 
            架构师    
            CTO  '''

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

你可能感兴趣的:(爬虫,Pyhton)