正则表达式
Posted huangqiang97
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式相关的知识,希望对你有一定的参考价值。
参考:正则表达式
# 正则表达式
import re
# 用d可以匹配一个数字,w可以匹配一个字母或数字,.可以匹配任意字符,s可以匹配一个空格(也包括Tab等空白符)
# 用*表示任意个(包括0个),用+表示至少一个字符,用?表示0个或1个字符,用{n}表示n个字符,用{n,m}表示[n~m]个字符
limit=r'd{3}s+d{3,8}'
result=re.match(limit,'123 74575545')
if result:
print('matched')
# - , ; _ : 是特殊字符,在正则表达式中,要用''转义:- , ; \_ :
# 要做更精确地匹配,可以用[]表示范围:[ABC]===>A or B or C
# [ABC]:表示满足表示至少满足三个条件中的一个的单个字符。
# [ABC]+ :表示由至少一个 满足A/B/C条件的单个字符 构成。
# [ABC]* 表示任意个 满足A/B/C条件的单个字符 构成。
# [ABC]{0,5}: 表示由0~5个 满足A/B/C条件的单个字符 构成
print('---------------------------------------------')
limit=r'[a-zA-Z\_][0-9a-zA-Z\_]*'
if re.match(limit,'result_1_A'):
print('match')
if re.match(limit,'9_result_1_A'):
print('match')
# A|B可以匹配A或B,|运算符优先级很低,AB|CD :满足条件AB 获得CD
print('---------------------------')
result=re.match(r'd\_|[a-z]+','4_')
print(result)
result=re.match(r'd\_|[a-z]+','erererer')
print(result)
# ^表示行的开头,^d表示必须以数字开头。
# $表示行的结束,d$表示必须以数字结束。
print(re.match(r'^d+[a-z]','111a1a'))
# 由于Python的字符串本身也用转义,'ABC\-001'==>ABC_001
# 建议使用Python的r前缀,就不用考虑转义的问题:r'ABC-001'==>ABC_001
# re.match(limit,str)方法判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None。
# re.split(limit,str)返回切割后的str数组
print(re.split(r'[,;s]+','1,2,;3 ,4; 5'))
# 提取满足条件的子串的强大功能
# m=re.match(^(limit_0)limit_1(limit_2)$,str):把满足条件0,2的字串提取出来
# m.group(0):str本身,group(1)开始才为目标字符串,groups():返回目标子串的元组。
m=re.match(r'(^d{3})[s-]+(d+)$','123 - 74575120')
print(m.groups())
# 贪婪匹配
# 正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。
# r'^(d+)(0*)$' :数字0会被划入第一个条件。
# 加个?就可以采用非贪婪匹配:r'^(d+?)(0*)$'
# '.*?'表示最短匹配任意长度字符串,长度可以为零
m=re.match(r'(d+)(0*)','123700000')
print(m.groups())
m=re.match(r'^(d+?)(0*)$','123700000')
print(m.groups())
# 编译
# 当我们在Python中使用正则表达式时,re模块内部会干两件事情:
# 编译正则表达式,如果正则表达式的字符串本身不合法,会报错;
# 用编译后的正则表达式去匹配字符串。
# 如果一个正则表达式要重复使用几千次,出于效率的考虑,我们可以预编译该正则表达式,接下来重复使用时就不需要编译这个步骤了,直接匹配
# compiled_limit=re.compile(limit)
# complied_limit.match(str)
# complied_limit.split(str)
temp=re.compile(r'(^d{3})[s-]+(d*)$')
print(temp.match('545 - 4546455').groups())
# 邮箱验证
def email_match(email):
'''
>>>
>>> email_match('tom@voyager.org')
(True, 'tom')
>>> email_match('bill.gates@microsoft.com')
(True, 'bill.gates')
>>> email_match('mr-bob@example.com')
False
:param email:
:return: [true,name]or false
'''
limit=r'^[w][w.\_]+@[w]+.[a-z]+$'
result=re.match(limit,email)
if result:
#
limit=r'.*?([w.]+)'
name=re.match(limit,email)
return (True,name[1])
else:
return False
if __name__=='__main__':
import doctest
doctest.testmod()
以上是关于正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性