当我们在 Python 中使用正则表达式时,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替换所有匹配 |
模式 | 描述 |
---|---|
\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