Chinaunix首页 | 论坛 | 博客
  • 博客访问: 31923
  • 博文数量: 5
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 56
  • 用 户 组: 普通用户
  • 注册时间: 2017-03-14 09:59
文章分类

全部博文(5)

文章存档

2017年(5)

我的朋友

分类: Python/Ruby

2017-07-26 11:19:58

正则表达式是一些由字符串和特殊字符组成的字符串,它用一种描述性的语言来给字符串定义一个规则,这个规则模式可以用来匹配一系列具有相似特征的字符串,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。

正则表达式常用的特殊符号和字符
Python字符串中特殊字符需要使用'\'进行转义,而使用Python的r前缀,可以不用考虑转义的问题,所以建议使用r前缀
正则表达式 说明 正则表达式举例 匹配的字符串举例
直接给出字符  精确匹配 "foo" "foo","food"
. 匹配除换行符之外的 任意字符

\d 匹配一个数字    

\w 匹配一个字母或者数字
\s 匹配任何空白符 \s " "
^ 匹配开头 ^Dear "Dear Mr"
$ 匹配结尾 .py$ "test.py"
* 匹配前面的正则表达式零次或者多次 a\d* "a","a78"
+ 匹配前面的 正则表达式一次或者多次 a\d+ "a3","a22"
匹配前面的 正则表达式零次或者一次 a\d? "a","a4"
{N} 匹配前面的正则表达式N次 a\d{3} "a245"
{N,M} 匹配前面的正则表达式N到M次 a\d{3,8} "a12345"
[...]
匹配中括号中的任意一个字符 [3fod] "3","f","o","d"
[x-y] 匹配x到y中的任意一个字符 [0-9a-zA-Z] 任意一个数字或者字母
[^...] 不匹配中括号中的任何字符 [^0-9] 非数字字符
x|y 匹配x或者y foo|bar "foo","bar"

re模块常用函数介绍
match(Pattern,String) 用正则表达式Pattern匹配字符串String,如果匹配成功,则返回一个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')
None

match()函数尝试从String的开头开始进行匹配
>>print(re.match(r'foo','food'))
<_sre.SRE_Match object; span=(0, 3), match='foo'>
>>print(re.match(r'foo','goodfood'))
None

search(Pattern,String) 在String中查找Pattern匹配的第一次出现,如果匹配成功则返回一个匹配对象,否则返回None
search()函数并不是从开头处匹配,而是从左到右进行搜索
>>print(re.search(r'foo','seafood'))
<_sre.SRE_Match object; span=(4, 7), match='foo'>

findall(Pattern,String) 在String中查找Pattern匹配的所有非重复出现,返回匹配对象的列表
>>re.findall(r'\d+','age is 25, number is 923')
['25', '923']

sub(Pattern,Repl,String)把String中所有匹配Pattern的地方替换成字符串Repl
>>re.sub(r'\s+','-','010 1234  5678')
010-1234-5678

split(Pattern,String)根据Pattern中的分隔符把String分隔成一个列表并返回这个列表
普通的切片,不能识别连续的空格
>>> 'a b   c'.split(' ')
['a', 'b', '', '', 'c'] 
>>> re.split(r'\s+', 'a b   c')
['a', 'b', 'c']
>>> re.split(r'[\s\,]+', 'a,b, c  d')
['a', 'b', 'c', 'd']
提取分组
除了判断是否匹配之外,还经常需要从字符串中提取出匹配的子串,这就用到了正则表达式的分组功能。
正则表达式中一个()表示一个要提取的分组
比如^(\d{3})-(\d{3,8})$分别定义了两个组,分别可以用group(1)和group(2)提取,group(0)用于提取完整的匹配字符串,groups()返回子组的集合
>>> 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'
>>> m.groups()
('010', '12345')
贪婪匹配
正则表达式默认采用贪婪匹配,也就是匹配尽可能多的字符。
>>> re.match(r'^(\d+)(0*)$', '102300').groups()
('102300', '')
(\d+)尽可能多的匹配字符,所以将后面的0全部匹配,导致(0*)没有匹配到任何字符。
必须让(\d+)采用非贪婪匹配,也就是尽可能少的匹配字符,(0*)才能将0匹配出来。
\d+后面加上一个?就表示采用非贪婪匹配,?是非贪婪操作符,可以用在“*”,“+”,“?”的后面。
>>> re.match(r'^(\d+?)(0*)$', '102300').groups()
('1023', '00')

参考资料:

阅读(1203) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~