正则表达式

2019-01-15  本文已影响0人  有趣的恶魔QAQ

一、正则表达式

1.什么是正则表达式(语法通用)

正则就是一种用来做字符串匹配的工具,可以通过不同的符号匹配不同的字符

2.python对正则表达式的支持

通过re模块提供相应支持正则表达式的方法

python中的正则表达式是写在字符串中的,但是一般情况下会在最前面加r/R

from re import fullmatch, search
1 普通字符(代表字符本身)
匹配一个字符串,只有三个字符,每个字符分别是a,b,c
    re_str = r'abc'
    result = fullmatch(re_str, 'abc')
    print(result)
2 . (除\n之外,匹配任意字符)
匹配一个字符串,只有三个字符,第一个字符是a,第二个字符是任意字符,最后一个字符是c
    re_str = r'a...c'  # 可以加多个点每一个点是一个字符
    result = fullmatch(re_str, 'a-*&c')
    print(result)
3 \w (匹配字母数字下划线中文,一个\w只能匹配一个字符)
匹配一个字符串,第一个字符是任意字符,第二个和第三个字符是字母、数字或者_
    re_str = r'.a\w\w'
    result = fullmatch(re_str, 'aa_3')
    print(result)
4 \s (匹配空白字符,指的是所有能产生空白的字符,包括空格、制表符、换行等)
第一个字符是任意字符,第二个是字母数字下划线中文,第三个是空白,第四个是任意字符,第五个是空白

####### 注意:\r和\n都可以表示空白

    re_str = r'.\w\s.\s'
    result = fullmatch(re_str, 'a2 &\n')
    print(result)
5 \d (匹配数字字符)
re_str = r'.\w\d'
result = fullmatch(re_str, '2_3')
print(result)
6 \b (检测单词边界,即检测正则表达式中\b所在的位置是否是单词边界)
单词边界:所有可以将两个单词区分开的符号都是单词边界,如: 空格、缩进、标点符号
匹配一个字符串的内容是'how are',并且要求字符'a'的前面是单词边界
注意:\b不是匹配符号,不会匹配出一个字符,只是检测所在的位置是否满足要求
re_str = r'how \bare'
result = fullmatch(re_str, 'how are')
print(result)
7 ^ (检测字符串开头)
匹配一个字符串,并且第一个字符所在的位置是字符串开头
    re_str = r'^.\w\s\d'
    result = search(re_str, 'a2 2*&342gwg')
    print(result)
8 $ (检测字符串结尾)
匹配一个字符串是三个数字字符,并且最后一个字符的后面是字符串结尾
re_str = r'\d\d\d$'
result = search(re_str, 'fhowqh2141')
print(result)
9 [字符集] (匹配字符集中的任意一个字符)
注意:一个[]代表一个字符
    re_str = r'[abc]123'
    result = fullmatch(re_str, 'a123')
    print(result)
###### 匹配一个字符串有4个字符,第一个字符是数字1-9中的任意一个;最后一个字符是任意小写字母;中间两个字符是任意数字
    re_str = r'[1-5]\d\d[a-z]'
    result = fullmatch(re_str, '211b')
    print(result)

10 [^字符集] - 匹配没有在字符集中的其他任意字符

注意:^放在[]的最前面才表示匹配不在字符集中的其他任意字符;如果它不放在[]的最前面,就表示本身是个字符

匹配一个字符串,第一个字符只要不是abc中的一个,其他的字符都可以,后面123
re_str = r'[^abc]123'
result = fullmatch(re_str, '啊123')
print(result)

# 第一个字符是'a','b','c',或者^ 中的任意一个
re_str = r'[abc^]123'
result = fullmatch(re_str, '^123')
print(result)
11 转义符号
   re_str = r'\d\d\.\d\d'
   print(fullmatch(re_str, '12.34'))
   print(fullmatch(r'[.]', '.'))

if __name__ == '__main__':
   main()

二、匹配次数

import re
def main():
1 *(匹配0次或者多次)

①字符* - 指定的字符出现0次或者多次(这儿的字符可以是正则符号,也可以是普通字符)

    re_str = r'[a-z]*123'
    print(re.fullmatch(re_str, 'cz123'))
123前面有0个或者多个字符,并且每个字符都是数字字符
re_str = r'\d*123'
print(re.fullmatch(re_str, '123414123'))
2 + (匹配1次或者多次)
re_str = r'a+123'
print(re.fullmatch(re_str, 'aa123'))
3 ? (匹配0次或者1次)
re_str = r'\+?123'
print(re.fullmatch(re_str, '+123'))
练习:写一个正则表达式能够匹配所有的整数字符串
re_str = r'[+-]?[1-9]\d*'
print(re.fullmatch(re_str, '52532'))
4 {}
{M,N} - 匹配M到N次(最少M次,最多N次)
{M,}  - 匹配至少M次
{,N}  - 匹配最多N次
{N}   - 匹配N次
密码:6-10位,只能包含数字和字母
    print(re.fullmatch(r'[a-zA-Z\d]{6,10}', '32rfeswgs3'))

三、分支和分组

1 |(分支)
- 表达式1|表达式2|表达式3  - 先用表达式1进行匹配,匹配成功就成功,不成功使用表达式2去匹配,以此类推。(三个表达式中只要有一个匹配成功就成功,否则匹配失败)


re_str = r'[a-z]{3}|\d{3}'
print(re.fullmatch(re_str, 'das'))
2 () (分组)
    (\d{2})abc\1  --> 12abc12
    """
    re_str = r'(abc){2}'
    print(re.fullmatch(re_str, 'abcabc'))

    # 重复分组
    re_str = r'(\d{2}\.)abc\1'
    print(re.fullmatch(re_str, '12.abc12.'))
上一篇 下一篇

猜你喜欢

热点阅读