正则表达式

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()

以上是关于正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

markdown 正则表达式模式片段

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性

循环通过 python 正则表达式匹配

asp.net 使用正则表达式验证包含打开/关闭括号片段的属性字符串

攻破难啃的骨头-正则表达式(转)

正则表达式的贪婪和非贪婪模式