5

Python正则表达式简介,匹配字符串及预编译 | CHEGVA

 1 year ago
source link: https://chegva.com/5638.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Python高级(20)—正则表达式简介,匹配字符串及预编译

◎知识点

  1. 正则表达式的简介

  2. 使用re模块实现字符串的匹配

  3. 正则表达式的预编译

◎脚本练习

▽ 正则表达式的简介

"""
    正则表达式是字符串处理的利器,它可以用于字符串的匹配、查找、替换和劈分。虽然在前面的课程中
也学习过字符串的查找、替换和劈分,但是借助正则表达式和标准库模块re可以实现更加强大的查找、替换和劈分。
其中,标准库模块re是专门用于支持正则表达式的。

    正则表达式是一个特殊的字符串,该字符串中包含了一些特定字符,这些特定字符都有明确的匹配规则,
因此,正则表达式是一个定义了匹配规则的字符串。如果某个字符串符合正则表达式定义的所有匹配规则,那么
该字符串就与该正则表达式匹配。
    如果想要判断一个字符串是否是合法的Email地址,就可以通过正则表达式来定义合法的Email地址
需要满足的规则,然后把要判断的字符串和定义的正则表达式进行匹配。

    正则表达式在很多编程语言中都是适用的,且绝大部分语法都是通用的。
    在正则表达式中,普通字符用于精确匹配,特定字符具有明确的匹配规则,例如: 
    \d用于匹配任意一一个数字,. 用于匹配除换行符之外的任意一个字符。 因此,
    'ab\d'可以匹配'ab0'、'ab1'、 'ab2'、'ab3'、 'ab4'、 'ab5'、 'ab6'、 'ab7'、'ab8'、 'ab9' ;
    ab.'可以匹配'ab3'、'abc'、'ab#'、等等,但无法匹配'ab\n'。
"""
Python

Python高级(20)—正则表达式简介,匹配字符串及预编译

▽ 使用re模块实现字符串的匹配

"""
如果想要判断给定的字符串和正则表达式是否是匹配的,可以使用模块re提供的方法:
    match(pattern,string[, flags])
    该方法会根据参数string指定的字符串与参数pattern指定的正则表达式进行匹配。
    其中,
        参数pattern是一个正则表达式,或对正则表达式预编译之后得到的对象。
        参数flags是一个标志位,用于控制正则表达式的匹配方式,如:是否区分大小写、多行匹配等。
        如果需要同时使用多个标志位,可以使用|对标志位进行分隔。
    该方法会从参数string指定的字符串的开头开始,一直向后尝试匹配参数pattern指定的正则表达式,
在到达pattern的末尾前,如果遇到无法匹配的字符或到达了string的末尾,都表示匹配失败,从而返回None。
否则,当到达pattern的末尾时,如果所有的字符都是匹配成功的,则表示匹配成功,从而终止匹配,不再对
string向后匹配,同时,返回一个Match对象。

    根据方法match()的返回值可知,常见的判断方式为:
    if re.match(正则表达式,被匹配的字符串):
        print('匹配成功')
    else:
        print('匹配失败')
"""

import re

print(re.match(r'...', 'a\nc')) # None
print(re.match(r'...', 'ab'))   # None

print(re.match(r'...', 'abc'))      # <re.Match object; span=(0, 3), match='abc'>
print(re.match(r'...', 'abcdef'))   # <re.Match object; span=(0, 3), match='abc'>

# <re.Match object; span=(0, 7), match='aBCdefG'>
print(re.match(r'[a-z]{7}', 'aBCdefG', re.I))
# <re.Match object; span=(0, 10), match='a\ncaBCdefG'>
print(re.match(r'...[a-z]{7}', 'a\ncaBCdefG', re.I|re.S))
Python

▽ 正则表达式的预编译

"""
    当在python中使用正则表达式时,正则表达式会首先被编译。如果一个正则表达式要重复使用多次,
处于效率的考虑,可以预编译该正则表达式,这样,接下来重复使用时就不需要再编译了。

    模块re提供了预编译正则表达式的方法:
    compile(pattern[, flags])
    其中,
        参数pattern是一个正则表达式。
        参数flags是一个标志位,与方法match()中参数flags的含义完全相同。
    该方法会返回对正则表达式预编译之后得到的对象。
"""

import re

obj = re.compile(r'...')
print(obj)  # re.compile('...')

"""
    方法compile()的返回值提供了一些方法,在模块re中都有对应的方法。例如:
除了直接调用模块re的方法match()之外,也可以调用模块re的方法compile()的返回值的方法:
    match(string[,pos[ ,endpos ]])
    其中,
        参数pos用于指定被匹配的字符串的起始位置,默认值是0;
        参数endpos用于指定被匹配的字符串的结束位置,默认值是字符串的长度。被匹配的子串不包括结束位置。
        
    因为在方法compile()中可以指定参数pattern和flags,所以,在调用其返回值的方法时,不需要
再指定参数pattern和flags;而调用模块re中的对应方法时,则需要指定参数pattern和flags。
    模块re的方法match()中的参数pattern和flags被转移到了方法compile()中。
"""

# <re.Match object; span=(0, 3), match='abc'>
# print(re.match(r'...', 'abcdef'))
print(re.compile(r'...').match('abcdef'))

print(re.compile(r'...').match('abcdef', 1, 3)) # None
Python

◎脚本地址:https://github.com/anzhihe/learning/blob/master/python/practise/learn-python/python_senior/regex.py

安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/5638.html | ☆★★每天进步一点点,加油!★★☆ | 

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK