天天看点

re正则表达式re基础语法常用正则表达式findall函数的应用

文章目录

  • re基础语法
    • 运算优先级
  • 常用正则表达式
    • 单个字符
    • 组合字符
  • findall函数的应用

re这个模块提供了与 Perl 语言类似的正则表达式匹配操作。其模式和被搜索的字符串既可以是 Unicode 字符串 (str) ,也可以是8位字节串 (bytes)。 但是,Unicode 字符串与8位字节串不能混用:也就是说,你不能用一个字节串模式去匹配 Unicode 字符串,反之亦然;类似地,当进行替换操作时,替换字符串的类型也必须与所用的模式和搜索字符串的类型一致。

re基础语法

正则表达式可以包含普通或者特殊字符。绝大部分普通字符,比如 ‘A’, ‘a’, 或者 ‘0’,都是最简单的正则表达式。它们就匹配自身。你可以拼接普通字符,所以 last 匹配字符串 ‘last’. (在这一节的其他部分,我们将用 this special style 这种方式表示正则表达式,通常不带引号,要匹配的字符串用 ‘in single quotes’ ,单引号形式。)

有些字符,比如 ‘|’ 或者 ‘(’,属于特殊字符。 特殊字符既可以表示它的普通含义, 也可以影响它旁边的正则表达式的解释。

重复修饰符 (, +, ?, {m,n}, 等) 不能直接嵌套。这样避免了非贪婪后缀 ? 修饰符,和其他实现中的修饰符产生的多义性。要应用一个内层重复嵌套,可以使用括号。 比如,表达式 (?:a{6}) 匹配6个 ‘a’ 字符重复任意次数。

运算优先级

正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。相同优先级的从左到右进行运算,不同优先级的运算先高后低。

下表从最高到最低说明了各种正则表达式运算符的优先级顺序:

运算符 描述
\ 转义符
(), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \任何元字符、任何字符 定位点和序列(即:位置和顺序)
| 替换,“或"操作字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food”。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。

常用正则表达式

单个字符

1. . 就 是匹配除 \n (换行符)以外的任意一个字符

str = 'aabbabaabbaa'
print(re.findall(r'a.b',str))
           
['aab', 'aab']
           

2. *前面的字符匹配0次或以上

str = 'aabbabaabbaa'
print(re.findall(r'a*b',str))
           
['aab', 'b', 'ab', 'aab', 'b']
           

3. +前面的字符匹配1次或以上

str = 'aabbabaabbaa'
print(re.findall(r'a+b',str))
           
['aab',  'aab']
           

4. ?前面的字符匹配0次或1次

str = 'aabbabaabbaa'
print(re.findall(r'a?b',str))
           
['aab',  'ab', 'ab', 'aab', 'ab']
           

5. {m}对其之前的正则式指定匹配 m 个重复

少于 m 的话就会导致匹配失败。比如, a{6} 将匹配6个 ‘a’ , 但是不能是5个。

6. {m,n}对正则式进行 m 到 n 次匹配,在 m 和 n 之间取尽量多。

比如,a{3,5} 将匹配 3 到 5个 ‘a’。忽略 m 意为指定下界为0,忽略 n 指定上界为无限次。 比如 a{4,}b 将匹配 ‘aaaab’ 或者1000个 ‘a’ 尾随一个 ‘b’,但不能匹配 ‘aaab’。逗号不能省略,否则无法辨别修饰符应该忽略哪个边界。

组合字符

’*‘ 和 '+‘修饰符都是 贪婪的,它们在字符串进行尽可能多的匹配;在修饰符之后添加 ‘?’ 将使样式以 非贪婪方式进行匹配,尽量少的字符将会被匹配。

1. .*贪婪,匹配从.*前面为开始到后面为结束的所有内容

str = 'aabbabaabbaa'
print(re.findall(r'a.*b',str))
           
['aabbabaabb']
           

2. .*? 非贪婪,遇到开始和结束就进行截取,因此截取多次符合的结果,中间没有字符也会被截取

['aab', 'ab', 'aab']
           

3. (.*?) 非贪婪,与上面一样,只是与上面的相比多了一个括号,只保留括号的内容

['a', '', 'a']
           

findall函数的应用

它在re.py中有定义:

def findall(pattern, string, flags=0):
    """Return a list of all non-overlapping matches in the string.
    If one or more capturing groups are present in the pattern, return
    a list of groups; this will be a list of tuples if the pattern
    has more than one group.
    Empty matches are included in the result."""
    return _compile(pattern, flags).findall(string)
           

即返回string中所有与pattern匹配的全部字符串,返回形式为数组。

import re
 
str = '一段字符串'
print(re.findall(r'正则表达式',str))
           

re.findall( r’正则表达式’, str, re.S),参数有re.S,则不会对’\n’进行中断

参考资料:

re — 正则表达式操作

正则表达式基本用法