正则表达式

正则表达式介绍

什么是正则表达式

Regular Expression, 又称规则表达式。
正则表达式就是用事先定义好的一些特定字符(组合),组成一个“规则字符串”,这个“规则字符串”用来描述一种字符串的匹配模式(pattern);

正则的作用

可以用来检查一个字串是否包含某种子串、将匹配的子串替换或者取出

正则的特点

灵活性、逻辑性和功能性非常强大

正则表达式的使用方法

re模块常用函数和方法

  • import re
  • result_obj = re.search(正则表达式, 数据,flag=0) —-查找数据中第一个符合匹配规则的字符串
    • search()函数从数据中只能查找到第一个符合正则数据放到result_obj中, 如果没有匹配到想要匹配的结果会返回None
  • result_obj.group() —-查看正则匹配的结果内容
    • result_obj.group(1, 2/ 组名) 返回需要组的匹配的结果,返回一个包含多个组匹配结果的元组; result_obj.group() == result_obj.group(0) == 正个正则表达式所有匹配的字符

re模块其他常用方法

1541300873462

compile 编译

  • 作用

    • 对正则表达式匹配规则进行预编译,在大量使用到正则的时候,可以提高匹配的速度
  • 使用方法

    • p = re.compile(‘匹配规则’, re.DATALL)
    • p.search(‘字符串’) 按照编译的规则对字符串进行匹配正则表达式中的特殊字符
      • 匹配单个字符

正则表达式常用匹配方式

匹配单个字符

1541301141193

  • 空白字符\s == [ \f\n\r\t\v] 非空白字符 \S == [^\f\t\v\n\r]
  • 在正则表达式中若只是想要匹配一个像特殊字符的普通字符需要在特殊字符前面加转义字符“\” 例如“.”
  • 特殊字符在[ ]中例如:[. | * + ?等 ]没有特殊功能只代表普通字符
  • 在[ ]中若是想使用“-”普通字符要加上转义字符\

匹配多个字符

1541301215631

常用定位符

1541301242792

正则表达式的分组

1541301315452

  • 注意:
    • 在使用(|)的时候尽量使特殊的或者通用的变量放在前边
    • 在引用分组的时候注意:\num表示八进制数num所表示的普通ASCII码字符,所以在引用的时候会默认表示ascii码字符,所以要注意转义或者使用原生字符串

匹配所有的汉字的方法

  • re.compole(r’[\u4e00-\u9fa5]’)
    备注:匹配所有unicode编码的中文

正则表达式的贪婪与懒惰

概念:

  • 贪婪-尽可能多的匹配
  • 懒惰-尽可能少的匹配

    默认为贪婪模式的匹配模式

  • 在python中 +/*/{m,n}默认情况下总是贪婪的

    如何让贪婪模式变为懒惰模式

  • 在量词后加上一个?
  • 例子:
    1541301444152

原生字符串的应用

特殊字符的转义

在表达式中如果包含“\”表示转义\后面的字符为八进制数字代表的ascii对应的特殊字符,在python中会对ascii包含的数字或者字符进行转义,这种情况会导致会将匹配规则的字符进行转义,结果不能匹配到想要匹配的字符串内容

解决办法:

  • 取消转义
    在每一个’'字符前加上’',对”'进行转义,这样会取消\的转义功能,将\只代表一个\字符,不会对后边的字符进行转义
    ascii不包括的字符,如果前边有转义字符\,不需要加以转义,python会自动转义

  • 原生字符串
    如果在表达式或字符串前边加上r“”对字符串中的\字符自动转义
    在使用的时候,匹配规则可以和想要匹配的内容写法相同,r会自动帮我们转义
    示例: re.search(r’abc\nabc’, ‘abc\nabc’)

    正则表达式的常见问题

    如何让 . 特殊符号可以匹配所有内容(包括\n)

  • 解决办法:
    使用re.DOTALL 参数

  • 示例:
    re.findall(r’abc.’, ‘abc\n\nsfgs’, re.DOTALL)
    备注:也可以使用re.S 代替re.DOTALL 效果上是一样的

    Ascii码对应关系

  • 在字符串,或者正则表达式中,\n\t等控制字符 或者 \数字(表示八进制的num所表示的普通ascii码)等显示字符,在应用的时候会默认为在调用ascii码的控制字符或者是显示字符,所以如果只是想表达单纯的字符 需要用\n或者r””这种形式进行转意,可以使用chr(八进制数)来查询对应的ascii字符

  • ascii码表

    1541301800714

刘小恺(Kyle) wechat
如有疑问可联系博主