正则表达式的简单运用(1)

  用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')

 

 
posted @ 2018-10-17 20:00  泰初  阅读(515)  评论(0编辑  收藏  举报