python通过re模块,实现正则表达式基本功能

正则表达式就是记录文本规则的代码。

在开发过程中,我们需要查找某些复杂规则的字符串,比如邮箱,手机号,图片地址。这个时候就要使用正则表达式了。

正则表达式的样子:

0\d{2}-\d{8} 这个就是正则表达式,表达的意思是匹配的是座机号码。

正则表达式的特点:

正则表达式的语法很让人头疼,可读性差。

正则表达式的通用性很强,能使用与各种语言。

代码示范:


# 导入re模块
import re

# 通过re调用match方法 进行字符串匹配
# 如果match匹配成功,那么返回一个re 对象 如果不成功,那返回一个空值.
ret = re.match('itcast','itcast.cn') # 精确匹配

# re中的match 模块只能从头匹配
# ret = re.match('itcast','www.itcast.cn') # 精确匹配


print(ret)

if ret:
    print(ret.start())  # 匹配的开始
    print(ret.end())    # 匹配的结束
    print(ret.span())   # 匹配的区间 左闭右开


# 获取匹配内容
print(ret.group())





 

匹配单个字符:

代码 功能
.   
匹配任意1个字符(除了\n)
[ ] 
匹配[ ]中列举的字符
\d  
匹配数字,即0-9
\D  
匹配非数字,即不是数字
\s  
匹配空白,即 空格,tab键
\S  
匹配非空白
\w  
匹配非特殊字符,即a-z、A-Z、0-9、_、汉字
\W  
匹配特殊字符,即非字母、非数字、非汉字

import re

# .
print(re.match('.','123'))
print(re.match('.','abc'))
print(re.match('.','一二三'))
print(re.match('.','#$%^&'))
print(re.match('.','\n'))

print('*' * 20)


# []   []中的任意一个与‘ ’ 中的第一个进行匹配
print(re.match('[123]','123'))
print(re.match('[123]','223'))
print(re.match('[123]','323'))
print(re.match('[123]','145'))
print(re.match('[hH]','hello'))
print(re.match('[hH]','Hello'))
print(re.match('[hH]','python'))
print(re.match('[0123456789]','2'))
print(re.match('[0123456789]','a'))
print(re.match('[0-9]','2'))           # 0到9 进行匹配
print(re.match('[0-9]','a'))
print(re.match('[0-46-9]','3'))       # 0-4和6-9 里匹配

print('*' * 20)

# \d
print(re.match('\d','2'))      # 0到9 进行匹配
print(re.match('\d','a'))
print('*' * 20)

# \D
print(re.match('\D','2'))      # \D	匹配非数字,即不是数字
print(re.match('\D','a'))
print('*' * 20)


# \s
print(re.match('\s',' '))
print(re.match('\s','   '))
print(re.match('\s','\n'))
print(re.match('\s','a'))
print('*' * 20)

# \S
print(re.match('\S',' '))
print(re.match('\S','   '))
print(re.match('\S','\n'))
print(re.match('\S','a'))
print('*' * 20)

# \w
print(re.match('\w','d'))
print(re.match('\w','F'))
print(re.match('\w','5'))
print(re.match('\w','_'))
print(re.match('\w',''))
print(re.match('\w','一'))
print(re.match('\w','&'))

print('*' * 20)

# \W
print(re.match('\W','d'))
print(re.match('\W','F'))
print(re.match('\W','5'))
print(re.match('\W','_'))
print(re.match('\W',''))
print(re.match('\W','一'))
print(re.match('\W','&'))

匹配多个字符:

代码 功能
*   
匹配前一个字符出现0次或者无限次,即可有可无
+   
匹配前一个字符出现1次或者无限次,即至少有1次
?   
匹配前一个字符出现1次或者0次,即要么有1次,要么没有
{m} 
匹配前一个字符出现m次
{m,n}   
匹配前一个字符出现从m到n次
{m,} 
至少匹配m个

 

import re

# *
print(re.match('\w*','a'))
print(re.match('\d*','a'))
print(re.match('[a1]*','a'))
print(re.match('\d*','1234589a123'))  # 匹配到9就结束了。

print('*' * 10)
# +
print(re.match('\w+','a'))
print(re.match('\d+','a'))
print(re.match('[a1]+','a'))
print(re.match('\d+','1234589a123'))
print('*' * 10)

# ?
print(re.match('\d?','1'))
print(re.match('\d?','a'))
print(re.match('\d?','123'))
print('*' * 10)

# {m,n}
print(re.match('.{2,4}','1'))
print(re.match('.{2,4}','1234'))
print(re.match('.{2,4}','12345'))
print(re.match('.{2}','1'))
print(re.match('.{2}','12'))
print(re.match('.{2}','123'))


print('*' * 10,'至少匹配m个')
# 至少匹配m个
print(re.match('.{2,}','1'))
print(re.match('.{2,}','12'))
print(re.match('.{2,}','123'))
print(re.match('.{2,}','1234'))



print('*' * 10)

# 匹配一个座机电话
print(re.match('\d{3,4}-\d{7,8}','010-8888888'))
print(re.match('\d{3,4}-\d{7,8}','021-77777777'))
print(re.match('\d{3,4}-\d{7,8}','022-666666'))
print(re.match('\d{3,4}-\d{7,8}','0451-8888888'))
print(re.match('\d{3,4}-\d{7,8}','9876-1234566'))
print(re.match('\d{3,4}-\d{7,8}','0451-0234566'))

print(re.match('0\d{2,3}-[1-9]\d{6,7}','9876-1234566'))
print(re.match('0\d{2,3}-[1-9]\d{6,7}','0451-0234566'))

 

指定匹配开头,结束和指定除外的字符:

代码 功能
^ 匹配字符串开头
$   
匹配字符串结尾
[^xxx] 
除指定字符外的字符

import re

# ^
print(re.match('^\d+','1'))
print(re.match('^\d+','123'))
print(re.match('^\d+','a123'))


# [^]
print(re.match('[^\d]+','1'))
print(re.match('[^\d]+','a'))
print(re.match('[^\d]+','aa'))
print(re.match('[^\d]+','12'))

# ^[^] 以 除指定字符开头的规则
print(re.match('^[^\d]+','1abc'))
print(re.match('^[^\d]+','abc1'))


# $
print(re.match('\d$','1'))
print(re.match('.*\d$','11'))    # .# 表示任意个
print(re.match('.*\d$','a11'))
print(re.match('.*\d$','11a'))

 

 

 匹配分组:

代码 功能
|  
匹配左右任意一个表达式
(ab)    
将括号中字符作为一个分组
\num    
引用分组num匹配到的字符串
(?P)  
分组起别名
(?P=name)   
引用别名为name分组匹配到的字符串
import re

# |
print(re.match('[a-z]|[A-Z]ython','Python'))
print(re.match('[a-z]|[A-Z]ython','python'))
print(re.match('[a-z]|[A-Z]ython','jython'))
print(re.match('[a-z]|[A-Z]ython','1ython'))
print(re.match('[a-z]|[A-Z]ython','a'))

print('*' * 40 ,'(|)')
# (|)
print(re.match('([a-z]|[A-Z])ython','Python'))
print(re.match('([a-z]|[A-Z])ython','python'))
print(re.match('([a-z]|[A-Z])ython','jython'))
print(re.match('([a-z]|[A-Z])ython','1ython'))
print(re.match('([a-z]|[A-Z])ython','a'))          # ython 不匹配

# 匹配一个邮箱是否是qq.com/163.com/sina.com


print(re.match('[a-zA-Z0-9_]{4,8}@(qq|163|sina).com','[email protected]'))
print(re.match('[a-zA-Z0-9_]{4,8}@(qq|163|sina).com','123456@qq'))
print(re.match('[a-zA-Z0-9_]{4,8}@(qq|163|sina).com','123456@163'))
print(re.match('[a-zA-Z0-9_]{4,8}@(qq|163|sina).com','[email protected]'))
print(re.match('[a-zA-Z0-9_]{4,8}@(qq|163|sina)\.com','123456@sinaacom'))


# () 匹配分组
# 销量:888 库存:99999
# ret = re.match('.*(\d+).*(\d+)','销量:888 库存:99999')
ret = re.match('销量:(\d+) 库存:(\d+)','销量:888 库存:99999')
print(ret)
print(ret.group())
print(ret.group(0))
print(ret.group(1))
print(ret.group(2))


# \num
ret = re.match('<[a-zA-Z0-9]+>(.*)','
皮鞋皮鞋
') print(ret) # ret = re.match('<[a-zA-Z0-9]+>(.*)','
皮鞋皮鞋

') ret = re.match('<([a-zA-Z0-9]+)>(.*)','
皮鞋皮鞋

') print(ret) # r'' 正则表达式中的原生字符串,表示在字符串中的字符都是普通字符,无特殊意义 ret = re.match(r'<([a-zA-Z0-9]+)>(.*)','
皮鞋皮鞋
') print(ret) print(ret.group(2)) # 为分组设置名 (?P) 通过分组名获取分组 (?P=name) ret = re.match(r'<(?P[a-zA-Z0-9]+)>(.*)','
皮鞋皮鞋
') print(ret) print(ret.group(2))

 

 

 

 

你可能感兴趣的:(正则表达式)