正则表达式和re模块的相关了解

  • 正则表达式

  • re模块

一、正则表达式

1、什么叫正则表达式

正则表示式是一门可以匹配满足要求的字符串的技术,任何语言均可使用。

2、为什么要用正则表达式

用正常的代码去编写匹配一段很长的字符串的时候,代码量过大,不便于程序的运行;用正则表达式可以大大的简化匹配字符串的程序,让匹配过程变得简洁。

# 纯python代码校验
while True:
    phone_number = input('please input your phone number : ')
    if len(phone_number) == 11 \
            and phone_number.isdigit()\
            and (phone_number.startswith('13') \
            or phone_number.startswith('14') \
            or phone_number.startswith('15') \
            or phone_number.startswith('18')):
        print('是合法的手机号码')
    else:
        print('不是合法的手机号码')
      
      
# 正则表达式校验
import re
phone_number = input('please input your phone number : ')
if re.match('^(13|14|15|18)[0-9]{9}$',phone_number):
        print('是合法的手机号码')
else:
        print('不是合法的手机号码')

# 可以看出,使用正则匹配电话号码的码量和逻辑关系远小于存python代码校验
3、正表达式的写法

正则表达式利用一些特定字符去匹配字符串。

字符组 : 在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示 字符分为很多类,比如数字、字母、标点等等。 假如你现在要求一个位置"只能出现一个数字",那么这个位置上的字符只能是0、1、2...9这10个数之一。

正则             待匹配字符     匹配       说明
[0123456789]      8         TRUE    在一个字符组里枚举合法的所有字符,字符组里的任意一个字符
[0123456789]      a         FALSE    由于字符组中没有"a"字符,所以不能匹配
[0-9]             7         TRUE    也可以用-表示范围,[0-9]就和[0123456789]是一个意思
[a-z]             s         TRUE    同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示
[A-Z]             B         TRUE    [A-Z]就表示所有的大写字母
[0-9a-fA-F]       e         TRUE    可以匹配数字,大小写形式的a~f,用来验证十六进制字符
.       匹配除换行符(\n)以外所有字符
\w      匹配字母数字下划线
\s      匹配任意空白符
\d      匹配数字
\n      匹配换行符(\n)
\t      匹配一个制表符
\b      匹配一个单词的结尾
^       匹配字符串的开始
$       匹配字符串的结尾
\W      匹配除字母数字下划线外所有字符
\S      匹配除空白符外所有字符
\D      匹配除数字外所有字符
a|b     匹配字符a或b
()      匹配括号内表达式,也表示一个组
[..]    匹配字符组中的字符
[^..]   匹配字符组总外的字符
*         重复0次或更多次
+         重复1次或更多次
?        重复0次或1次
{n}       重复n次
{n,}     重复n次或多次
{n,m}    重复n次或m次
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
. 是任意字符
* 是取 0 至 无限长度
? 是非贪婪模式。

.*?x:就是取前面任意长度的字符,直到一个x出现

二、re模块

三个必须掌握的方法

  • findall

  • search

  • match

    ret = re.split('[ab]', 'abcd')  # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
    print(ret)  # ['', '', 'cd']
    
    ret = re.sub('\d', 'H', 'eva3egon4yuan4', 1)#将数字替换成'H',参数1表示只替换1个
    print(ret) #evaHegon4yuan4
    
    ret = re.subn('\d', 'H', 'eva3egon4yuan4')#将数字替换成'H',返回元组(替换的结果,替换了多少次)
    print(ret)
    
    obj = re.compile('\d{3}')  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
    ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
    print(ret.group())  #结果 : 123
    
    import re
    ret = re.finditer('\d', 'ds3sy4784a')   #finditer返回一个存放匹配结果的迭代器
    print(ret)  # <callable_iterator object at 0x10195f940>
    print(next(ret).group())  #查看第一个结果
    print(next(ret).group())  #查看第二个结果
    print([i.group() for i in ret])  #查看剩余的左右结果
    import re
    res = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$','110105199812067023')
    res = re.search('^[1-9](?P<password>\d{14})(?P<username>\d{2}[0-9x])?$','110105199812067023')
    print(res.group())
    print(res.group('password'))
    print(res.group(1))
    print(res.group('username'))
    print(res.group(2))
    print(res.group(2))
    print(res.group(1))
    import re
    ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
    print(ret) # ['oldboy'] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
    ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
    print(ret) # ['www.oldboy.com']
    ret=re.split("\d+","eva3egon4yuan")
    print(ret) #结果 : ['eva', 'egon', 'yuan']
    
    ret=re.split("(\d+)","eva3egon4yuan")
    print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan']
    
    #在匹配部分加上()之后所切出的结果是不同的,
    #没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,
    #这个在某些需要保留匹配部分的使用过程是非常重要的。

     

posted on 2019-07-17 22:11  so_interesting  阅读(117)  评论(0编辑  收藏  举报

导航