正则表达式的用途非常多,包括文本的字符串处理,爬虫,分析日志等,第一次使用正则是通过perl,处理文本的时候感觉真是如虎添翼,怎一个爽字了得,现在编程基本都在使用python,python内置的正则表达式的模块是re,下面做个简单介绍。

1.元字符

  • . 表示任意字符
  • ^ 在中括号外表示以下一个字符开头,在中括号内表示取非
  • $ 表示以上一个字符结尾
    • 匹配前面字符或者表达式0次或者0次以上
    • 匹配前面字符或者表达式0次或者0次以上
  • ? 匹配前面字符或者表达式0次或者1次,停止贪婪
  • { } 括号内容为数值,表示匹配次数
1
2
3
{19} 匹配前面字符或者表达式1-9
{1,} 匹配前面字符或者表达式至少1
{,9} 匹配前面字符或者表达式至多9
  • 匹配的集合
1
2
3
4
5
[0-9] 匹配数字
[a-z] 匹配小写字母
[A-Z] 匹配大写字母
[A-Za-z] 匹配字母不区分大小写
[A-Za-z0-9] 匹配所有字母和数字
  • \ 表示转义
  • | 逻辑或
  • ( )分组匹配,可以用来捕获目标字符串

2.表达符号

  • \d 匹配数字,同[0-9]
  • \D 匹配任意非数字,同[^0-9]
  • \s 匹配任意空白字符,同[\t\n\r\f\n]
  • \S 匹配任意非空白字符,同[^\t\n\r\f\n]
  • \w 匹配任意字母数字字符及下划线,同[A-Za-z0-9_]
  • \W 匹配任意非字母数字字符,同[^A-Za-z0-9]

3.使用正则表达式
加载re模块,标准库自带,无需下载

1
2
3
4
5
6
7
import re
```
- re.findall 三个参数(匹配模式,字符串,匹配选项) 找到所有匹配到的字符串,并返回一个列表

``` python
a = re.findall(r'abc','abceababcd')
print a

匹配成功,返回含有两个字符串的列表
['abc', 'abc']

1
2
a = re.findall(r'abc','abdeababecd')
print a

匹配失败,返回空列表
[]

  • 匹配元字符 如 $,需要在元字符前面加\进行转义
1
2
a = re.findall(r'abc\$','abc$')
print a

['abc$']

  • re.I 不区分大小写
1
2
a = re.findall(r'A|B','abc',re.I)
print a

['a', 'b']

  • 括号作用,在匹配时候添加括号,结果只显示括号里面的内容
1
2
a= re.findall(r'abc(\dabc)abc','abc1abcabc')
print a

['1abc']

  • re.group() 分组捕获,re.group()**->** re.group(0)
    re.group(1) -> 捕获第一个括号里的内容
    re.group(2) -> 捕获第二个括号里的内容
    往后以此类推
  • re.M 多行匹配
  • re.group 分组捕获
  • re.match() 只匹配字符串开头的位置,返回一个对象
1
2
3
4
5
a = re.match(r'a(bc)d(sdf)sfd','abcdsdfsfd')
print a.group()
print a.group(0)
print a.group(1)
print a.group(2)

注意结果中的区别

1
2
3
4
abcdsdfsfd
abcdsdfsfd
bc
sdf
  • re.search() 从做到右进行匹配,直到找到一个为止(更为常用,与re.group()连用,注意与re.match()的区别)
  • re.sub(模式,替换内容,字符串,替换次数) 0代表全部替换;等同于perl里面的 string~s/pattern/relpace/
1
2
print re.sub(r'he','HE','hellohello') #默认匹配次数是0,全部替换
print re.sub(r'he','HE','hellohello'1)
1
2
HElloHEllo   #全部替换
HEllohello #只替换了一次
  • re.complie() 编译正则的模式提高效率
1
2
3
4
5
6
7
8
9
10
11
12
13
14
p = re.compile(r'ab*')
s = 'sfabbbcsf'
a = p.search(s)
print a.group()
```

```abbb```

- re.S 匹配换行符

``` python
p = re.compile(r'abc\na',re.S)
a = p.search('abc\naa')
print a.group()
1
2
abc
a

4.两个规则

1
2
贪婪模式->尽可能多的匹配    
懒惰匹配->只匹配一次就结束

5.总结

re.findall() 查找所有匹配对象
re.match() 匹配开头
re.search() 从左至右,查找一个符合条件的字符串

可选项
re.I 匹配忽略大小写
re.M 进行多行匹配
re.S 匹配换行符