正则表达式

来源:互联网 发布:foreach去除数组重复值 编辑:程序博客网 时间:2024/06/15 14:06

正则表达式


一、简单的介绍

  字符串是编程语言当中涉及最多的一种数据类型,C语言在产生早期70年代的时候所做的主要是数值计算,因此在那个年代对字符串操作的函数很少。目前我们数值的string.h就是专门用于字符串操作的标准库,然而里面的函数也不多,功能也不强大。后来产生的一些高级编程语言,例如python就对字符串操作有着强大的支持。
  正则表达式定义了一个规则用于匹配字符串,而正则表达式本身也是一个字符串。英文名称Regular Expression,在python中的库为首字母简写’re’,使用时可以直接进行导入:

import re
  • 为什么要使用正则表达式?
    答:写过代码的都知道,通常在我们进行搜索以及替换操作时,需要输入确切匹配的字符串。很显然,这样的操作方式并不灵活,对于一些动态的字符匹配难以成功。而正则表达式就可以做到。

  • 那么通过正则表达式我们可以做到哪些事情呢?
    答:从一堆字符串当中过滤掉不符合我们预先通过正则表达式设定的规则的部分,获取我们需要的特定的部分。最常见的应用就是网络爬虫,爬取网上的图片、pdf文本,爬取热门的微博评论,爬取招聘网站上的职位等等。

  • 正则表达式的特点:
    强大,灵活,逻辑性强。

  • 正则表达式的编译:
    当我们在使用正则表达式匹配前,re模块首先需要编译我们预先设定的正则表达式,然后再用编译好后的表达式去匹配字符串。因此如果我们需要多次重复使用正则表达式,预编译是一个明智的决定:

re_c = re.compile(r'^(\d{3})-(\d{3,8})$')

二、正则表达式匹配规则

  1. 直接给出字符,即为精确匹配:’007’匹配’007’, ‘test’匹配’test’
  2. ‘\d’可以匹配数数字等价于[0-9],’\w’可以匹配包括下划线的任何单词字符等价于’[A-Za-z0-9_]’:’\d\d\d’可以匹配’123’,’\w\w\d’可以匹配’ab1’但不能匹配’abc’
  3. ‘.’可以匹配除换行符\n以外的任意字符:’ab.’可以匹配’ab1’,’abc’等
  4. 变长字符匹配:
    • 表示任意多个字符:前面的字符出现0次1次或多次,等价于{0,}
    • +表示至少一个字符:+前面的字符出现至少一次,等价与{1,}
    • ?表示0个或1个字符:?前面的字符出现0次或1次,等价于{0,1}
    • {n}表示n个字符:’\d{3}’匹配三个数字
    • {n,m}表示n~m个字符:’\d{3,8}’匹配3~8个数字
    • {n,}:至少匹配n次
  5. \s:匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [\f\n\r\t\v]。
  6. \S:匹配任何非空白字符。等价于 [^ \f\n\r\t\v]
  7. \W:匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]’
  8. [0-9a-zA-Z_]:匹配一个数字、字母或者下划线
  9. [0-9a-zA-Z_]+:匹配至少一个字符的字符串
  10. [^a-z]:匹配不在a-z范围内的任意字符
  11. \b:匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配”never” 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。
  12. \B:匹配非单词边界。’er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。
  13. \D:匹配非数字,等价于[^0-9]
  14. (A|B):匹配A或B,(P|p)ython匹配’python’或’Python’
  15. \f \n \r \t \v:分别匹配换页、换行、回车、制表符、垂直制表符
  16. ^表示开头:^\d表示以数字开头
  17. $表示结束:\d$表示以数字结束
  18. 正则表达式的匹配默认是贪婪匹配,也即匹配尽可能多的字符,加一个?可以进行非贪婪匹配。

三、运算符优先级

  • 转义符:\
  • 括号:()、(?:)、(?=)、[]
  • 限定符:*、+、?、{n}、{n,}、{n,m}
  • 定位点和序列:^、$、\任何元字符、任何字符
  • 替换,”或”操作:|

四、re模块的使用

  • 字符串当中的转义字符是一个很让人头疼的问题,令人高兴的是在python的字符串前加上r前缀可以不用考虑字符串中转义的问题,这让我们进行正则表达式的匹配方便了许多。
  • re模块中的match函数用来判断字符串是否匹配,如果匹配成功,返回一个Match对象,否则返回None:
>>> import re>>> re.match(r'^\d{3}\-\d{3,8}$', '010-12345')<_sre.SRE_Match object; span=(0, 9), match='010-12345'>>>> re.match(r'^\d{3}\-\d{3,8}$', '010 12345')>>>
  • split可以切分空格及其他字符:
>>> re.split(r'[\s\,\;]+', 'a,b;; c  d')['a', 'b', 'c', 'd']
  • group可以用于分组或提取子串:
>>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')>>> m<_sre.SRE_Match object; span=(0, 9), match='010-12345'>>>> m.group(0)'010-12345'>>> m.group(1)'010'>>> m.group(2)'12345'
0 0
原创粉丝点击