python入门(五) —— 正则表达式 re

正则表达式(Regular Expression)是字符串处理的常用工具,在文本匹配、检索、替换中起到很重要的作用。

本文从以下两个方面介绍正则表达式:

  • re语法

  • re使用方式
    语言:python

概念

正则表达式(Regular Expression)是字符串处理的常用工具,通常被用来检索、替换那些符合某个模式(Pattern)的文本

通常,以正则表达式的语法写出表达式,经过编译之后,用于文本匹配、查找。

语法

摘自链接

注意:

  • 字符一栏,如果单独使用,则只匹配一个字符。如果要匹配多个字符,需和数量词一起使用。

  • 如果要匹配某个词本身,则直接写这个词本身即可。如:匹配abc, 则直接r'abc'即可

实例

字符类

实例 描述
[Pp]ython 匹配 “Python” 或 “python”
rub[ye] 匹配 “ruby” 或 “rube”
[aeiou] 匹配中括号内的任意一个字母
[0-9] 匹配任何数字。类似于 [0123456789]
[a-z] 匹配任何小写字母
[A-Z] 匹配任何大写字母
[a-zA-Z0-9] 匹配任何字母及数字
[^aeiou] 除了aeiou字母以外的所有字符
[^0-9] 匹配除了数字外的字符

特殊字符类

实例 描述
. 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。
\W 匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]’。

注意:

  • []:方括号。匹配需要的字符集合,如[1-3][123]都是匹配1、2或者3。

  • ():圆括号。匹配需要的字符串集合。如(abc|edf)可以匹配abc或edf。

  • ^:方括号中加入这个符号,就是匹配未列出的所有其他字符,如[^a]匹配除a以外的所有其他字符。

  • \: 反斜杠。和python字符串使用规则一样,可以匹配特殊字符本身,如\d表示匹配0到9的任意一个数字字符,而\\d则表示匹配\d本身。

  • *:星号。匹配前一个字符0到n次,如pytho*n可以匹配pythn、pytoon、pythooooon等。还有其它匹配重复字符的如?、+或{m,n},其中{n,m}可以灵活使用,它表示匹配n次到m次。

  • 贪婪模式与非贪婪模式:

    • 贪婪:总是尝试匹配尽可能多的字符
    • 非贪婪:总是匹配尽可能少的字符
    • 例如,用”ab*“查找”abbbc”,将找到”abbb”。而如果使用非贪婪的数量词”ab?”,将找到”a”

使用方法

编译

1
2
import re 	# 引入python中的re包。这里用到的是python3
pattern = re.compile(r'abc\b', re.S) # # 将正则表达式编译成Pattern对象

可以看到,compile后面跟了两个参数。第一个参数是要匹配的正则表达式,第二个参数是匹配模式。

匹配模式:

注: 在下文中用flag来表示

  • re.I (re.IGNORECASE):忽略大小写

  • re.M (MULTILINE):多行模式,改变’^’和’$’的行为

  • re.S (DOTALL): 点任意匹配模式,改变’.’的行为,使其可以匹配包括\n在内的字符

  • re.L (LOCALE):使预定字符类 \w \W \b \B \s \S 取决于当前区域设定

  • re.U (UNICODE):使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性

  • re.X (VERBOSE):详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。

匹配

编译好了之后就可以使用了

查找

regex.findall(string[, pos[, endpos\]]

1
2
3
4
5
6
7
8
9
# 编译模式,提取所有数字
pattern = re.compile(r'\d')

pattern.findall('12cda3s5z') # 在string中查找所有符合pattern的字符串,并以列表形式返回
# 返回['1','2','3','5']

res = pattern.finditer(string) # 在string中查找所有符合pattern的字符串,返回迭代器
# 返回res, 用for可依次提取出来

匹配

regex.match(string[, pos[, endpos]])

1
2
3
4
5
6
7
8
9
10
11
pattern = re.compile(r'bel*a\b')

pattern.match('arabella') # 在string中从头开始匹配第一个符合pattern的字符串
# 如果找不到,则返回None;如果找到,则返回字符串
# 返回None,因为从头匹配

pattern.match('bella')
# 返回bella

pattern.match('bella_tso')
# 返回None, 因为后面不是空格

搜索

regex.search(string[, pos[, endpos\]])

1
2
3
4
pattern = re.compile(r'bel*a\b')

pattern.search('arabela')
# 返回arabela。因为不是从头开始匹配,只要存在即可

修改

分割

regex.split(string, maxsplit=0)

1
2
3
4
pattern = re.compile(r'\d*')

pattern.split('12a234b3c')
# 返回['a','b','c']

替换

regex.sub(repl, string, count=0)

1
2
3
4
5
pattern = re.compile(r'bella')

pattern.sub(r'arabela', 'bella_tso')
# 返回arabela_tso

参考链接:

http://www.runoob.com/python3/python3-reg-expressions.html

https://songlee24.github.io/2014/09/01/python-library-02/