正则表达式为高级的文本模式匹配,抽取,与 / 或文本形式的搜索和替换功能提供了基础,简单的来说,正则表达式是由一些字符和特殊符号组成的字符串。Python 通过标准库中的 re 模块来支持正则表达式。
首先介绍一下最常见的特殊符号和字符,即所谓的元字符。
表示法 | 描述 | 正则表达式用法示例 |
---|---|---|
literal | 匹配文本字符串的字面值 literal | re.findall("chen","sadchen21") |
. | 匹配任意字符(除了 \ n 之外) | re.findall("c..n","sadchen21") |
^ | 从字符串开始部分开始匹配 | re.findall("^sad","sadchen21") |
$ | 匹配字符串的终止部分 | re.findall("21$","sadddchen21") |
* | 匹配 0 次或多次前面出现的正则表达式 | re.findall("sad*","saddddchen21") |
+ | 匹配 1 次或多次前面出现的正则表达式 | re.findall("sad+","sadddchen21") |
? | 匹配 0 次或者 1 次前面出现的正则表达式 | re.findall("sad?","sadddchen21") |
{N} | 匹配 N 次前面出现的正则表达式 | re.findall("sad{3}","sadddchen21") |
{M,N} | 匹配 M~N 次前面出现的正则表达式 | re.findall("sad{1,3}","sadddcen21") |
[] | 匹配来自字符集的任一单一字符 | re.findall("[a-z]","sadddcen21") |
[^..] | 不匹配此字符集中出现的任一字符,包括某一范围的字符 | re.findall("[^a-z]","sadddcen21") |
(...) | 匹配封闭的正则表达式,然后另存为子组 | re.findall("[(a-z)]","sadddcen21") |
\d | 匹配任何的十进制数,与 [0-9] 一致(/D 与 / d 相反,不匹配任何非数值型的数字) | re.findall("\d","sa2dcen21") |
\w | 匹配任何字母数字字符,与 [A-Z],[a-z],[0-9] 相同,(\W 与之相反) | re.findall("\w","sa2dcen21") |
\s | 匹配任何空格字符,与 \ n\r\t 等相同,(与 \ S 相反) | re.findall("\s","sa2dce\nn 21") |
\b | 匹配任何单词边界,匹配特殊字符(\B 与之相反) | re.findall(r"I\b","I am Czp") |
在上面 / b 的例子中,为什么要加 r?
r 的作用就是让后面的字符串不做任何的转义,如果不加 r 能不能起到相同的作用呢?
- re.findall("I\\b", "I am Czp")通过转义符\来实现
- re.findall("ka|b","sdkakb11") 匹配ka或b
- re.findall("ka|b","sdka11")
- re.findall("s..a","sdka11") 匹配在s和a之间任意的两个字符
- re.findall("..","sdka11") 匹配任意两个字符
- re.findall(".a","sdka112") 匹配a前的任意一个字符
要显式匹配一个句点符号本身,必须使用反斜杠转义句点符号的功能,例如 "\."
- re.findall("^sa","sdka112") 匹配以s开头的字符或字符串
- re.findall("12$","sdka112") 匹配以12结尾的字符或字符串
匹配边界字符 "\b"
\b 用于匹配一个单词的边界,这意味着如果一个模式必须位于单词的起始部分,就不管该单词前面(单词位于字符串中间)是否有任何字符(单词位于首行),而 \ B 将匹配出现在一个单词中间的模式,即不是单词边界
- re.findall("er","never") 匹配任意包含the的字符串
- re.findall(r"er\b","never") 匹配任意以er为起始位置的字符串
- re.findall(r"er\B","evern") 匹配包含er但不以er为起始的字符串
创建字符集 "[]"
"." 可以用于匹配任意符号,但某些时候需要匹配某些特定字符,这就需要 [],用来匹配一对方括号中包含的任何字符。如 b[ner]t 匹配的字符串就是 bnt,bet,brt, 方括号表示逻辑或的功能,对于单个字符,如果想要:要么匹配 a,要么匹配 b,就可以用[ab] 表示,字符集只适用于单字符的情况,如果要匹配多个字符,就需要使用择一方法 "|"
最常用的特殊符号 """+""?"
""、"?"、"+"都可以用来匹配一个、多个或者没有出现的字符串模式,"*"用来匹配其左边的正则表达式出现零次或多次,"+"号将匹配一次或多次出现的情况,"?"将匹配零次或一次出现的正则表达式,而 {N} 或{M,N}这将最终精确的匹配前面的正则表达式 N 次或一定范围的次数。
当模式匹配使用分组操作符的时候,正则表达式的引擎将试图匹配出尽可能多的字符,这叫做贪婪匹配
- re.findall("sad*","saddddsds") 匹配d,d可以出现0次,或多次
- re.findall("sad+","saddddsds") 匹配d,d不可以出现0次,匹配1次或多次
- re.findall("sad?","saddddsds") 匹配d,d可以出现0次,匹配0次或1次
- re.findall("\d{2}","sad123dsds") 匹配两个连续的数字字符
如果想要提取任意已经成功匹配的特定字符串或子字符串,就需要用 "()" 来包裹正则表达式
当使用正则表达式的时候,一对圆括号可以实现以下任意一个功能
示例:当有两个不同的正则表达式而且想用它们来比较同一个字符串的时候,就需要用到 "()",还有对正则表达式进行分组可以重复使用操作符,使匹配到的子字符串保存起来以供后续使用。
扩展表示法,以问号开始 (?..),很重要的一个 (?P
常见的正则表达式属性
compile() | 使用可选的标记来编译正则表达式的模式,返回一个对象
match() | 匹配字符串,如果成功,就返回匹配对象,如果失败,就返回 None
search() | 匹配第一次出现的正则表达式,成功,返回匹配对象,失败,就返回 None
findall() | 查找字符串中所有出现的正则表达式模式,并返回一个匹配列表
finditer() | 与 findall 相同,但返回的不是一个列表,而是一个迭代器
spilt() | 将字符串分割为列表,返回成功匹配的列表
sub() | 替换所有正则表达式的模式在字符串中出现的位置
purge() | 清楚隐式编译的正则表达式模式
group() | 返回整个匹配对象,或者编号为 num 的特定子组
函数篇就写到这里,接下来会写面向对象部分的内容,如果有遗漏的,欢迎大家和我交流,我会第一时间补上遗漏的知识点。
来源: https://www.cnblogs.com/Chen-Zhipeng/p/8194096.html