zoukankan      html  css  js  c++  java
  • python re正则

    正则表达式 regex


    动机 : 对字符串(文本)的操作是计算机的主要工作之一
    从文本或大字符串中找到某一类型的字串
    为了解决以上问题----》 正则表达式

    定义 : 本质是由一系列字符和特殊符号组成的字串,用来表示一定规则的某 一类字符串。


    优点和使用 :

    1.是一个独立的技术
    2.能被多种编程语言使用 python ---》 re


    re.findall(regex,string)
    功能 : 按照正则表达式匹配字符串
    参数 : regex 正则表达式
    string 目标字符串
    返回值 : 返回一个列表,列表中是所有匹配到的内容


    正则元字符

    * 单个字符
    匹配规则 : 匹配相应的字符
    e.g. ab ab

    In [4]: re.findall('ab','abcdefabg')
    Out[4]: ['ab', 'ab']


    * 匹配单个字符

    元字符 : .
    匹配规则 : 匹配除‘ ’外的任意一个字符

    e.g. f.o ---> foo fao fbo

    In [6]: re.findall('f.o','faosfaafbo')
    Out[6]: ['fao', 'fbo']

    * 匹配字符串的开头位置

    元字符 : ^

    匹配规则 : ^位置必须为字符串的开始位置才可,通常和其他元字符同用

    e.g. ^abc abcdef

    In [8]: re.findall('^abc','abcdefgh')
    Out[8]: ['abc']

    * 匹配字符串结尾

    元字符: $
    匹配规则 : 匹配字符串的结尾位置

    e.g. py$ a.py

    In [11]: re.findall('py$','a.py')
    Out[11]: ['py']

    * 匹配重复

    元字符 : *
    匹配规则 : 匹配前面出现的正则表达式0次或多次

    e.g. ab* a ab abbbbb abbbbbb

    In [17]: re.findall('ab*','aabbabbljlk')
    Out[17]: ['a', 'abb', 'abb']

    * 匹配重复

    元字符 : +
    匹配规则 : 匹配前面出现的正则表达式1次或多次

    n [18]: re.findall('ab+','aabbabbljlk')
    Out[18]: ['abb', 'abb']


    * 匹配重复

    元字符 : ?
    匹配规则: 匹配前面出现的正则表达式0次或1次

    In [20]: re.findall('ab?','aabbabbljlk')
    Out[20]: ['a', 'ab', 'ab']

    * 匹配重复

    元字符 : {n}
    匹配规则: 匹配指定重复的次数

    In [22]: re.findall('ab{2}','aabbabbljlk')
    Out[22]: ['abb', 'abb']

    * 匹配重复

    元字符 : {m,n}
    匹配规则 : 匹配重复m次到n次

    In [26]: re.findall('ab{2,5}','aabbabbbbbbljlk')
    Out[26]: ['abb', 'abbbbb']

    * 字符集匹配

    元字符 : [abcd]
    匹配规则 : 匹配字符集中任意一个字符

    * 匹配字符区间

    元字符 : [0-9] [a-z] [A-Z]
    匹配规则 : 匹配区间内任意一个字符 不同区间可以写在一起,同时还能添加其他的字符集

    e.g. [_3-9a-z]

    In [30]: re.findall('[_0-9a-zA-Z]+','hello world hello py_2')
    Out[30]: ['hello', 'world', 'hello', 'py_2']


    *集合取反

    元字符 [^ ....]
    匹配规则 : 匹配任意一个不再集合中的字符

    e.g. [^0-9] a g & $

    In [31]: re.findall('[^0-9]+','hello world hello py_2')
    Out[31]: ['hello world hello py_']

    元字符 : d D
    匹配规则 : 任意一个数字字符 任意一个非数字字符
    In [32]: re.findall('d{8}','12345678')
    Out[32]: ['12345678']


    元字符 : w W
    匹配规则: 任意一个数字字母下划线 任意一个特殊字符
    [_0-9a-zA-Z] [^_0-9a-zA-Z]


    元字符: s S
    匹配规则: 任意空字符 匹配任意非空字符
    [ ]

    In [41]: re.findall('sS+','hello world nihao china')
    Out[41]: [' world', ' nihao', ' china']


    元字符 : A 
    匹配规则: 匹配字符串的开头位置^ 匹配字符串的结尾位置$

    In [52]: re.findall('Afoo','foo')
    Out[52]: ['foo']


    元字符:  B
    匹配规则 : 匹配单词边界位置 匹配非单词边界位置

    单词边界 : 数字字母下划线和其他字符交界的位置认为是单词边界

    In [59]: re.findall(r'foo','foo food foot')
    Out[59]: ['foo']

    In [60]: re.findall(r'fooB','foo food foot')
    Out[60]: ['foo', 'foo']


    元字符 : |

    匹配规则 : 连接多个正则表达式 形成或关系
    In [64]: re.findall('abc|bcd','abcdefbcdef')
    Out[64]: ['abc', 'bcd']

    转义字符
    * $ ? + d s

    1.正则表达式中有很多特殊字符为元字符,如果在设定匹配时需要匹配到特殊字符则用转义

    e.g. ----> \ * ---> * d ----> \d

    2. 当使用某个编程语言时,正则表达式往往要以字符串的形式传入
    而编程语言的字符串又有转义性质


    python str -----》 raw str 认为字符串中为原始内容,不进行转义

    \* *

    匹配单个字符 : 普通字符 . d D w W s S [...] [^...]

    匹配位置 : ^ $ A   B

    匹配重复次数 : * + ? {n} {m,n}

    其他 : |

    贪婪和非贪婪

    贪婪模式 : 当重复次数不确定是,正则表达式总是尽可能多的向后匹配

    * + ? {m,n}


    非贪婪模式 : 在重复的元字符后加?

    In [94]: re.findall('ab*?','abbbbbbba')
    Out[94]: ['a', 'a']

    In [95]: re.findall('ab+?','abbbbbbba')
    Out[95]: ['ab']


    正则表达式子组

    在一个正则表达式中可以用()取正则表达式的一部分,为该正则表达式的一个子组

    regex (ab)*cdef

    子组能干什么

    *子组表示一个内部的整体,可以改变重复的元字符作用范围
    *很多编程语言函数可以单独提取子组的内容
    *在使用和调用上更加方便

    一个正则表达式中原则上可以有很多子组。从外到内,从左到有分别称为第一子组,第二子组。。。。。。子组不要交叉


    捕获组

    子组命名 (?P<name>abcd)
    子组调用 (?P=name)

    (?P<dog>ab)cdef(?P=dog)


    非捕获组


    your time:

    匹配长度为8-10位的密码,必须以字母开头,数字字母下划线组成
    In [2]: re.findall(r'^[a-zA-Z]w{7,9}$','abc123_a')
    Out[2]: ['abc123_a']

    匹配身份证号
    In [6]: re.search(r'd{17}(d|x)','123123123123123123').group()
    Out[6]: '123123123123123123'


    匹配一段文字中以大写字母开头的单词

    In [14]: re.findall(r'[A-Z]w*',data)
    Out[14]: ['Python', 'Hello', 'World']


    python ---- > regex

    模块 re

    compile(pattern, flags=0)
    功能 : 生成正则表达式对象
    参数 : pattern : 正则表达式
    flags : 扩展标志位,默认为0表示不进行任何扩展
    返回值 : 正则表达式对象

    obj = compile('abc')

    以下 **** 中的函数既能re直接调用又能compile对象调用

    **************************************************
    re.findall(pattern, string, flags=0)
    功能 : 根据正则表达式匹配目标字符串
    参数 : pattern 正则表达式
    string 目标字符串
    flags : 正则扩展标志位
    返回值 : 匹配到的所有内容以列表返回
    如果有分组则只返回子组能匹配到的内容

    obj.findall(string=None, pos=0,endpos=99999)
    功能 : 根据正则表达式匹配目标字符串
    参数 : string 目标字符串
    pos : 匹配目标字符串的起始位置
    endpos : 匹配目标字符串的结束位置
    返回值 : 匹配到的所有内容以列表返回
    如果有分组则只返回子组能匹配到的内容


    finditer()
    功能 : 同findall
    参数 : 同findall
    返回值 : 返回一个迭代对象,迭代获取的每个值为match obj

    *match 对象 : finditer match fullmatch search
    这些函数将正则匹配到的结果以match对象的形式给出,方便进行过具体的操作

    fullmatch()
    功能 : 用正则表达式完全匹配某个字符串
    参数 : 目标字符串
    返回值 : 返回匹配到的match对象,如果没有匹配到返回None

    match()
    功能 : 匹配字符串的开头
    参数 : 目标字符串
    返回值i: 如果匹配到内容返回match object 否则返回None

    search()
    功能 : 匹配第一处符合正则的字串
    参数 : 目标字串
    返回值: 如果匹配到内容返回match object 否则返回None

    split()
    功能 : 按照正则表达式切割字符串
    参数 : 目标字符串
    返回值: 将切割后的字符串放入列表

    sub(re_str,string,max)
    功能 : 用指定字符串替换正则表达式匹配到的部分
    参数 : re_str 待替换的字符串
    string : 目标字符串
    max : 最多替换几处
    返回值 : 替换后的字符串

    subn()
    功能 : 用指定字符串替换正则表达式匹配到的部分
    参数 : re_str 待替换的字符串
    string : 目标字符串
    max : 最多替换几处
    返回值 : 返回值为二元元组,第一项为替换后的字符串,第二项为实际替换几处
    ****************************************************

    compile返回对象的属性

    flags : 正则表达式表示位的整形表示
    pattern : 正则表达式
    groupindex : 返回以捕获组的名称为键,第几组为值得字典
    groups: 正则表达式中一共有多少个子组


    match search fullmatch finditer

    match对象属性和方法

    属性:
    pos : 匹配目标字符串的开始位置
    endpos : 匹配目标字符串的结束位置
    lastgroup:获取最后一个子组的名称,如果没名字则为None
    lastindex:或许最后一个子组是第几子组
    re : match匹配所用的正则表达式
    regs : 正则表达式整体及每个子组所匹配的部分
    string : match匹配的目标字符串


    方法:

    start()
    得到匹配内容在字符串中的开始位置

    end()
    得到匹配内容在字符串中的结束位置(结束字符下标的下一个)

    span()
    得到匹配到的内容在字符串中的起止位置

    group(n)
    功能: 获取match对象匹配到的内容
    参数: n 默认为0表示 整个正则匹配到的内容
    当给n附一个正整数时则表示要获取第n个子组匹配内容
    返回值:返回匹配到的字符串

    groups()
    功能 : 获取所有子组匹配到的内容


    groupdict()
    功能 : 将捕获组的名称和匹配的内容形成键值对关系


    re.compile re.findall re.match re.search .....


    'A',
    'ASCII',

    'S' 让 . 可以匹配换行
    'DOTALL',

    'I', 忽略大小写
    'IGNORECASE'

    'L',
    'LOCALE',

    'M', 作用于 ^ $ 使其能匹配每行的开头结尾
    'MULTILINE'

    'T',
    'TEMPLATE',

    'U',
    'UNICODE'

    'X' 让你的正则可以添加以#开头的注释
    'VERBOSE',


    当多个flag同时使用时 中间用竖线分割
    re.I | re.S

  • 相关阅读:
    九宫格拼图 支持44 55等
    js 怎样获取div 图片等的宽度,只要值,不要px
    spring boot单元测试之RestTemplate(一)
    java设计模式-原型(prototype)
    Hibernate注解(二):关联关系映射注解
    spring之@value详解二(转载)
    spring之@Value详解(转载)
    Spring之基于注解的注入
    Spring之bean生命始末
    Spring之bean后处理器
  • 原文地址:https://www.cnblogs.com/Han-org/p/8915896.html
Copyright © 2011-2022 走看看