用Python从一篇文章中提取关键信息,涉及到不少知识。其中正则表达式这方面的内容很重要,所以我简单整理了下,方便以后的学习。
首先,正则表达式是什么?
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。(节选自百度词条)
作用(目的)是什么呢?
正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。它是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符串。给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”)。
2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。
简单使用实例:
实例一:
import re #re模块实现对复杂字符串的分析并提取出相关信息 pattern = re.compile(r'world') match = pattern.search('hello world!') print(re.match(r'.*(world)',('hello world!')).group(1)) if match: #使用match获得分组信息 print(match.group()) ### 输出 ### world 注释: ''' #将正则表达式编译成Pattern对象 pattern = re.compile(r'world') #使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None match = pattern.match('hello world!') #这个例子用match()无法成功匹配 #使用search()查找匹配的的字串,不存在能匹配的字串时将返回None '''
实例二:
import re #将正则表达式编译成pattern对象 pattern = re.compile(r'\d{3}-\d{3,8}$') #使用pattern匹配文本,获得匹配结果,无法匹配时将返回None match = pattern.match('010-12345') if match: #使用match获得分组信息 print(match.group()) ### 输出 ### 010-12345 注释: ''' ^在普通模式下有无无区别 {} 括号里面是数字,显示位数 $ 必须以XXX(紧跟着前面的内容)结尾,否则不匹配。 以上例来说,若不是以3至8位数字结尾则不匹配 '''
实例三:
import re #将正则表达式编译成pattern对象 pattern = re.compile(r'^(\d{3})-(\d{3,8})$' ) #使用pattern匹配文本,获得匹配结果,无法匹配时返回None match = pattern.match('010-12345') if match: #使用match获得分组信息 print(match.group(),match.group(0),match.group(1),match.group(2)) ### 输出 ### 010-12345 010-12345 010 12345 注释: ''' group()和group(0)作用一样 group(1),group(2)分别输出第一个括号和第二个括号内的内容 '''
实例四:
import re t = '19:05:30' m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$',t) m.groups if m: print(m.groups()) print(m.group(0)) print(m.group(1)) print(m.group(2)) print(m.group(3)) ### 输出 ### ('19', '05', '30') 19:05:30 19 05 30 注释: ''' groups()迭代group(X),将所有分组全部输出出来 '''
实例五:
import re print('字符串切分: ') print('a b c'.split(' ')) print('正则表达式切分: ') print(re.split(r'\s+','a b c')) #无论多少空格都可以正常分割 print(re.split(r'[\s\,]+','a,b, c d')) print(re.split(r'[\s\,\;]+','a,b;c d')) ### 输出 ### 字符串切分: ['a', 'b', '', '', 'c'] 正则表达式切分: ['a', 'b', 'c'] ['a', 'b', 'c', 'd'] ['a', 'b', 'c', 'd'] 注释: ''' split()切分,将总体分割成一个一个的单个小块儿 '''
实例六:
import re #这里是贪婪匹配,顾名思义,很贪婪,要最大限度地占用字符串 print(re.match(r'a.*d','abcdakdjd').group()) #这里是懒惰匹配,匹配到满足条件的地方就停止此次匹配 print(re.match(r'a.*?d','abcdakdjd').group()) ### 输出 ### abcdakdjd abcd
实例七:
import re print(re.match(r'^(\d+)(0*)$','102300').groups()) #由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了 print(re.match(r'^(\d+?)(0*)$','102300').groups()) #必须让\d+采用非贪婪匹配(也就是尽可能的少匹配),才能把后面的0匹配出来,加个?就可以采用非贪婪匹配 ### 输出 ### ('102300', '') ('1023', '00')