0%

8.正则表达式

Python 原创基础教程

第八章 正则表达式

基础

对字符串匹配的一套规则

1
2
3
4
5
6
7
8
9
import re #正则表达式的包

#1
pattern = re.compile('\d+\.\d+') #创建一个正则表达式对象
str = "1.12321, 432423.32 abc 123.123 342"
result = pattern.findall(str)

#2
result = re.findall('\d+\.\d+',str)
  • compile()

    编译正则表达式,返回一个正则表达式对象

  • findall()

    找到字符串中所有的匹配(以空格为间隔)

  • search()

    匹配整个字符串,直到找到一个匹配

  • match()

    从开始匹配字符串是否符合正则表达式

  • split()

    将匹配到的字符串当做分割点,对字符串进行分割,最终分割成列表

  • sub()

    替换

字符串前缀

  • u/U:

    表示unicode字符串

    1.不是仅仅是针对中文, 可以针对任何的字符串,代表是对字符串进行unicode编码。
    2.一般英文字符在使用各种编码下, 基本都可以正常解析, 所以一般不带u;但是中文, 必须表明所需编码, 否则一旦编码转换就会出现乱码。
    3.建议所有编码方式采用utf8

  • r/R:

    非转义的原始字符串

    1.与普通字符相比,其他相对特殊的字符,其中可能包含转义字符,即那些,\反斜杠加上对应字母,表示对应的特殊含义的,比如最常见的”\n”表示换行,”\t”表示Tab等。
    2.而如果是以r开头,那么说明后面的字符,都是普通的字符了,即如果是“\n”那么表示一个反斜杠字符,一个字母n,而不是表示换行了。
    3.以r开头的字符,常用于正则表达式,对应着re模块。

  • b:

    bytes

    1.python3.x里默认的str是(py2.x里的)unicode,
    2.bytes是(py2.x)的str, b”“前缀代表的就是bytes
    3.python2.x里,b前缀没什么具体意义,只是为了兼容python3.x的这种写法

正则表达式表

  • 字符
header 1 header 2
. 任意字符
row 1 col 1 row 1 col 2
row 2 col 1 row 2 col 2
  • 位置
位置 -
^ 匹配字符串的开头
$ 匹配字符串的结尾
  • 预定义字符集
预定义字符 -
\d 数字:[0-9]
\D 非数字:[^\d]
\w 字母数字
\W 非字母数字
  • 数量词
数量词 -
  • | 匹配前一个字符0次或无限次
  • | 匹配前一个字符1次或无限次
    ?| 匹配前一个字符0次或1次
    {m}|匹配前一个字符m次
    {m,n}|匹配前一个字符m至n次,m和n可以省略,上下界默认为0和无穷
  • 括号
括号 header 2
() 表示一个组,匹配结果缩小为()里面的组(不能匹配换行符)
ex: gr(a|e)y,匹配a或e
[…] 表示一个字符,ex:[akj]表示a或k或j
[^…] 表示不在里面的一个字符
{m} 匹配前一个字符m次
{m,n} 匹配前一个字符m至n次,m和n可以省略,上下界默认为0和无穷

特例

  • .* 和 .*?

    前者匹配结果重复最大的字符串,后者匹配结果重复 的最小字符串

1
2
3
4
s = 'aabab'
r1 = re.search('a.*b',s) #结果为aabab
r2 = re.search('a.*?b',s) #结果为aab

  • 匹配反斜杆

    需要4个反斜杆才能匹配1个反斜杆

  • 匹配换行符

    compile函数加参数re.DOTALL

((?:.|\n)*?)其中(?:.)是非捕获组