正则表达式的使用
前言:使用正则表达式向大量信息中获取有用信息
| 符号 | 意义 | |
|---|---|---|
| . | 除换行符以外的所有字符 | |
| \w(小写) | 字母数字下划线 | |
| \s(小写) | 空白符 | |
| \d | 数字 | |
| \n | 换行符 | |
| \t | 制表符 | |
| ^ | 字符串开始 | |
| $ | 字符串结尾 | |
| \W | 非字母数字下划线 | |
| \D | 非数字 | |
| \S | 非空白字符串 | |
| a|b | 匹配a或者b | |
| () | 括号内表达式 | |
| [...] | 匹配字符串组中所有字符 | |
| [^...] | 匹配除了字符串组中所有字符 | |
| * | 任意次 | |
| + | 至少一次 | |
| ? | 最多一次 | |
| {n} | n次 | |
| {n,} | 至少n次 | |
| {n,m} | n到m次 | |
| .* | 惰性匹配 | |
| .*? | 贪婪匹配 |
①匹配字符串
使用正则表达式需要导入re库
re有三个常用的函数
| 函数名 | 返回内容 |
|---|---|
| findall | 返回一个list(包含全部匹配到的内容) |
| finditer | 返回一个迭代器(包含全部匹配到的内容) |
| match | 字符串的第一个字符匹配起(若匹配失败返回None) |
| compile | 提前加载正则表达式(参数是正则表达式规则) |
三个函数的参数都可以传入两个参数:第一个是正则表达式规则,第二个是待匹配字符串
例子:
import re
message = "你好,我的名字是Tom,电话是10010。你的名字是Jay,电话是10086。他的名字是Jack,电话是10000。"
ans = re.findall("[a-zA-Z]+", message)
print("findall函数输出:", ans)
ans = re.finditer("[a-zA-Z]+", message)
print("迭代器输出:")
for it in ans:
print(it, it.group())
ans = re.match("[a-zA-Z]+", message)
print("match匹配:", ans)
输出内容如下:
findall返回list对象
迭代器输出得是迭代器对象,需要用it.group()获取匹配到的字符串
如果将message中的(你好,我的名字是)去掉match就能匹配到Tom,因为match相当于是默认使用了^,从头开始匹配,返回第一个字符串。
②从正则表达式中获取有用信息
import re
message = "你好,我的名字是Tom,电话是10010。你的名字是Jay,电话是10086。他的名字是Jack,电话是10000。"
obj = re.compile(r"\w+名字是(?P<a>\w+),电话是(?P<b>\d+)。")
ans = obj.finditer(message)
for it in ans:
print(it.group("a"),it.group("b"))
在re.compile中有两个相似的地方(?P<a>\w+)和(?P<b>\d+),其中w+和d+是匹配的规则,而?P尖括号中字符是一个标记,表示给我们需要的信息做一个标记,在迭代器中我们可以在group里加上标记参数从而拿到我们需要的数据。
注:compile中匹配规则左边的r表示不进行转义操作