Python 培训(通用)正则表达式

正则表达式

通配符:.

  • 句点与除换行符外所有字符都匹配,如 '.ython' 与 '+ython'、'jython' 都匹配。

转义符

  • \\ 表示转义符,因为 . 表示通配符,那么 \\. 表示真正的句点。
  • 在字符串前面加一个 r 就可以用一个 \ 表示转义,如 r'hhh\.'

字符集

  • [] 中的字符表示一个字符集,即其中的任意一个字符都匹配,如 '[pj]ython' 与 'python' 和 'jython' 匹配。
  • 字符集中还可以使用 - 表示范围。比如 '[a-zA-Z0-9]' 表示所有字母和数字。
  • 在开头加一个 ^ 表示除此之外的字符,比如 '[^ab]' 表示除了 ab 以外的字符。

预定义字符集

字符 说明
\d 数字
\D 非数字
\s 空白字符
\S 非空白字符
\w 单词字符
\W 非单词字符

数量词

  • 以下数量词指定前一个字符出现的次数
字符 说明
* 0到无限次
+ 1到无限次
0或1次
m m次
{m,n} m到n次
  • 如果想要指定多个字符出现次数,加上圆括号,比如 'TT(python)+JQ' 指定 python 可以出现多次。
  • 中括号里面的字符集可以任意出现,比如 '[pj]+ython' 可以匹配 'pjpython'。

数量词的贪婪与非贪婪

  • 数量词是默认贪婪的,也就是能尽可能多地匹配
  • 如果要设定为非贪婪的,可以在数量词后面加一个 ? 表示非贪婪。

匹配开头和结尾

  • 在字符串最前面加 ^ 表示只匹配字符串的开头,在字符串最后加 $ 表示只匹配字符串的结尾。

多选一模式

  • 用 (|)表示可以选择其中的任意一个,比如 '(apple|lemon|orange)juice' 可以匹配三种口味的果汁。与上述中括号区别是,中括号里面的可选字符都是单字符。

主要函数

  • 上面只介绍了如何用正则表达式表示想要处理的字符串,至于怎么去处理,就需要用到 re 模块的函数了。
  • 以下具有查询功能的函数,查询结果返回一个对象(逻辑真),如果没有匹配则返回 none(逻辑假)

compile(pattern)

  • 上述正则表达式是字符串形式,通过 compile 以后就可以转换成正则表达式的一个模式对象。
  • 是否转换为模式对象,都可以调用正则的函数,如下:
result = re.search(pattern, string)		#直接得到结果

obj = re.compile(pattern)
result = obj.search(string)				#先通过 compile 转换
  • 为方便起见,以下函数均按照转化后的调用方式。

search(string)

  • 查找第一个与正则表达式匹配的子串。

match(string)

  • 在字符串开头匹配正则表达式
  • 如果在正则表达式后面加 $ 说明必须要开头符合并且结尾也符合,也就是完全相同。

split(string, maxSplit)

  • 这个函数是提取数据的神器,可以根据正则表达式分割字符串,返回一个列表。
string = "alpha ,  , beta,,,  ,gamma"
result = re.split('[, ]+', string)
print(result)
# ['alpha', 'beta', 'gamma']
  • maxSplit 可以指定最多分割几次,如下:
string = "alpha ,  , beta,,,  ,gamma"
result = re.split('[, ]+', string, 1)
print(result)
# ['alpha', 'beta,,,  ,gamma']

findall(string)

  • 返回一个列表,其中包含字符串中所有与模式匹配的子串。
  • 注意这个函数虽然也是匹配查找,但是并不是返回对象。
  • 比如以下程序可以分割一篇文章的文字。
string = "waou, you can really dance !"
words = re.findall(r'\w+',string)
# ['waou', 'you', 'can', 'really', 'dance']

escape(string)

  • 将 string 中含有的所有正则表达式特殊字符进行转义。
  • 比如 'www.python' 就变成了 'www\.python'

sub(repl, string)

  • 将匹配字符全部转换为 repl
  • 这个方法基本操作与字符串的方法 replace 功能相同,但是在匹配对象编组后将会更加强大。

匹配对象编组

  • 上述函数返回的对象就是匹配对象,匹配对象会进行编组。我们在写正则表达式的时候,可以用 () 括起来一部分,这就是进行编组。
  • 比如 'there (was a (wee) (cooper) who (lived in Fyfe))' 就会被编成 0-4 组,根据从左到右第一次出现 ( 确定
    • 0 There was a wee cooper who lived in Fyfe
    • 1 was a wee cooper
    • 2 wee
    • 3 cooper
    • 4 lived in Fyfe
  • 匹配对象可以根据编组,有如下可以调用的方法(group 默认为 0):
方法 描述
group(group) 获取匹配子串
start(group) 获取匹配子串起始位置
end(goup) 获取匹配子串终止位置(与切片一样,不包括终止位置)
span(group) 获取起始和终止位置

替换中的组号

  • 最后我们看一下替换中组号的应用。
  • 先看一下很绕的定义:在替换字符串中,任何类似于 '\\n' 的转义序列都将被替换为与模式中编组 n 匹配的字符串。
string = '*this* is *it*'
pattern = r'\*(.+?)\*'
result = re.sub(pattern, r'<em>\1</em>', string)
print(result)
#  <em>this</em> is <em>it</em>
  • 用例子和人话解释一下,pattern 是识别 * * 的,并将 * 中间的字符串编为1组,后面是替换的字符串,将替换匹配的内容,中间 \1 由匹配的编号为1的内容替代。

本文章使用limfx的vsocde插件快速发布