python 正则表达式详解
2022年5月24日大约 4 分钟约 1163 字
正则表达式
[TOC]
为什么需要在正则表达式中使用raw字符串表示
正则表达式中使用"\"
加某些字符表示特殊序列,或者将特殊字符转义成普通文本。
在python字符串中"\"
的具有相同的作用。
为了在正则表达式中匹配"\"
需要写成"\\\\"
。我们要分别消除"\"
在python字符串中和正则表达式中的特殊含义。
为了解决这个问题,建议使用python的raw字符串表示正则表达式。在raw字符串中,""不被当作特殊字符使用。如r'\n'
表示两个字符''和'n',而不是换行。可以直接用r'\\'
去匹配"\"
。
模式
模式 | 描述 | 例子 |
---|---|---|
^ | 从整个字符串的开头开始匹配 | ^a :整个字符串必须以a开头 |
$ | 整个字符串以某个字符结尾 | a$ :整个字符串必须以a结尾 |
. | 任意一个字符(不包括换行\n) | |
* | 前一个字符可以有0个或多个(贪婪匹配) | .* :以最多的方式匹配任意字符(贪婪匹配) |
? | 匹配0个或1个由前面的正则表达式定义的片段(非贪婪方式) | .*? :尽可能少的匹配任意字符(非贪婪匹配) |
+ | 前一个字符最少有1个或多个(贪婪匹配) | |
{num} | 前一个字符重复num次 | a{2} :代表“aa”字符串 |
{num,} | 前一个字符重复≥num次(贪婪匹配) | a{2,} :代表"aa"或"aaaaaaaaaaaa" |
{num1,num2} | 前一个字符重复≥num1且≤num2次(贪婪匹配) | a{2,4} :代表"aa"或"aaa"或“aaaa” |
`str1 | str2` | 匹配str1或者匹配str2其中的一个。会先尝试匹配str1,如果匹配成功,则不会尝试str2 |
() | 小括号是分组,括号内匹配到的数据可以提取出来,如果括号有包含关系,从外到里按顺序提取数据 | |
[str] | 匹配str内任意一个字符('.'和'*'在中括号内是一般字符) | |
[0-9] | 匹配0到9中任意一个字符 | |
[^1] | 匹配不为1的字符 | |
\s | 空格 | |
\S | 非空格 | [\s\S] :包括\n的任意字符 |
\w | [0-9a-zA-z_] | |
\W | 非[0-9a-zA-z_] | |
[\u4E00-\u9FA5] | 汉字(固定写法) | |
\d | 数字 |
re.match
re.match(pattern, string, flags=0)
在字符串开头匹配pattern,如果匹配成功(可以是空字符串)返回对应的match对象,否则返回None。
即使是在多行模式下,re.mathch也只在字符串开头匹配,而不是每一行的开头。
判断是否匹配成功
import re
line = "bobby123"
regex_str = "^b.*" # 匹配以'b'开头的字符串
if re.match(regex_str, line): # 如果匹配失败返回None,匹配成功返回Match对象
print("yes")
分组取出数据
import re
line = "bobby123"
regex_str = ".*(b.y).*"
line_match = re.match(regex_str, line)
line_str = line_match.group(1) # 取出第一个括号的值
例子:匹配年月日
import re
regex_str = "\d{4}[年/-]\d{1,2}[月/-]?(\d{1,2}|$)"
默认只用一行匹配
如果是需要匹配的文本中有
换行符
,默认会只使用一行进行匹配如果想使用整个文本进行匹配,添加
re.DOTALL
re.match(".*", text, re.DOTALL)
re.fullmatch
re.fullmatch(pattern, string, flags=0)
string是否整个和pattern匹配,如果是返回对应的match对象,否则返回None。(python3.4)
re.search
re.search(pattern, string, flags=0)
从头扫描字符串string,找到与正则表达式pattern的第一个匹配(可以是空字符串),并返回一个对应的match对象。如果没有匹配返回None.
re.findall
re.findall(pattern, string, flags=0)
从左到右扫描字符串,按顺序将所有匹配到的字符串放到一个列表中并返回。
- 如果在pattern中有一个或多个组,返回捕捉到的组的列表;
- 如果有多个组,列表中的元素为元组;
- 结果中包含空字符串匹配;如果空匹配和另一个匹配相连,那么该空匹配忽略。
re.finditer
re.finditer(pattern, string, flags=0)
返回一个迭代器。匹配规则和findall相同。
常见的转义字符
转义字符 | 描述 |
---|---|
\(在行尾时) | 续行符 |
\\ | 反斜杠符号 |
\' | 单引号 |
\" | 双引号 |
\a | 响铃 |
\b | 退格(Backspace) |
\e | 转义 |
\000 | 空 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符 |
\r | 回车 |
\f | 换页 |
\oyy | 八进制数yy代表的字符,例如:\o12代表换行 |
\xyy | 十进制数yy代表的字符,例如:\x0a代表换行 |
\other | 其它的字符以普通格式输出 |