# 正则表达式-python篇
*正则表达式*
文章描述了有关 python 处理 正则表达式 相关的知识文库,敬请阅读!
## 开始

### compile()
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有,match 和 search 的区别也很大,详细信息在其它页有介绍
这里主要需要讨论的是其返回值的展现方式,即findall函数根据正则表达式的不同所返回的结果包含的不同信息!
```python
import re
data = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table>
<tr>
<td>张三</td>
<td>男</td>
</tr>
<tr>
<td>李四</td>
<td>男</td>
</tr>
<tr>
<td>爱嘤斯坦</td>
<td>女</td>
</tr>
<tr>
<td>汤姆瑞斗</td>
<td>男</td>
</tr>
</table>
</body>
</html>
"""
# compile 函数可以将一个正则表达式编译成为一个对象存储起来,使得我们可以复用这个正则表达式
matcher = re.compile(r"(<([a-zA-Z]+).*?>.*?</\2>)")
# 其中具有所有正则表达式中的函数,通过这些函数可以匹配到我们需要的所有结果组成的列表
res = matcher.findall(data)
# 值得注意的是,当正则表达式中使用到了括号包裹的时候,它匹配的是所有的括号
for s in res:
# 例如在这里,我们的每一个匹配结果中是这样的[<([a-zA-Z]+).*?>.*?</\2>的结果,\2 的结果],因为这里的两个括号包裹的是他们两个
print(s)
# 当然,如果正则表达式中没有被括号包裹的正则,那么它将会返回一个由整个正则表达式匹配的字符串
matcher = re.compile(r"<table.*?>[\s\S]*?</table>")
res = matcher.findall(data)
for s in res:
print(s)
```
### Match()
简单来说,在python中match函数的作用就是匹配一个字符串的起始位置是否满足正则表达式,如果满足,返回匹配结果,不满足返回None
```python
import re
data = """<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table>
<tr>
<td>张三</td>
<td>男</td>
</tr>
<tr>
<td>李四</td>
<td>男</td>
</tr>
<tr>
<td>爱嘤斯坦</td>
<td>女</td>
</tr>
<tr>
<td>汤姆瑞斗</td>
<td>男</td>
</tr>
</table>
</body>
</html>
"""
# compile 函数可以将一个正则表达式编译成为一个对象存储起来,使得我们可以复用这个正则表达式
pattern = re.compile(r"<.*?>")
# 通过match可以匹配到字符串的起始位置是否满足表达式,如果不满足表达式,这里返回None
matcher = pattern.match(data)
# 如果满足表达式,返回的是一个match对象,可以通过group方法获取到匹配到的数据
if matcher is not None:
# 开始匹配到的数据
print(matcher.group(0))
else:
print("匹配不成功!")
```
### Search()
```python
import re
data = """<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table>
<tr>
<td>张三</td>
<td>男</td>
</tr>
<tr>
<td>李四</td>
<td>男</td>
</tr>
<tr>
<td>爱嘤斯坦</td>
<td>女</td>
</tr>
<tr>
<td>汤姆瑞斗</td>
<td>男</td>
</tr>
</table>
</body>
</html>
"""
# compile 函数可以将一个正则表达式编译成为一个对象存储起来,使得我们可以复用这个正则表达式
pattern = re.compile(r"(<([a-zA-Z]+).*?>.*?</\2>)")
# 通过search 可以匹配到第一个满足正则表达式的字符串结果,如果匹配到,返回对象
matcher = pattern.search(data)
# 如果满足表达式,返回的是一个match对象,可以通过group方法获取到匹配到的数据
if matcher is not None:
# 开始匹配到的数据
print(matcher.group(0))
else:
print("匹配不成功!")
Sub()
import re
data = """<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table>
<tr>
<td>张三</td>
<td>男</td>
</tr>
<tr>
<td>李四</td>
<td>男</td>
</tr>
<tr>
<td>爱嘤斯坦</td>
<td>女</td>
</tr>
<tr>
<td>汤姆瑞斗</td>
<td>男</td>
</tr>
</table>
</body>
</html>
"""
# compile 函数可以将一个正则表达式编译成为一个对象存储起来,使得我们可以复用这个正则表达式
pattern = re.compile(r"(<([a-zA-Z]+).*?>.*?</\2>)")
# 通过sub 可以将一个字符串中符合正则表达式的字符串替换成,然后返回一个新字符串
string = pattern.sub("----------", data)
print(string)
```
### findAll()
查找所有满足正则表达式的匹配项,是一个列表,其中的每一个元素是列表或字符串,当正则表达式中有小括号的时候,返回的列表中的每一个元素不只是一个正则匹配,还有很多小括号的匹配,因此每一个元素是一个元组。
当正则表达式没有小括号的时候,返回的列表中的每一个元素都是字符串,因为正则表达式的匹配项是正则本身。
```python
import re
data = """<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table>
<tr>
<td>张三</td>
<td>男</td>
</tr>
<tr>
<td>李四</td>
<td>男</td>
</tr>
<tr>
<td>爱嘤斯坦</td>
<td>女</td>
</tr>
<tr>
<td>汤姆瑞斗</td>
<td>男</td>
</tr>
</table>
</body>
</html>
"""
# compile 函数可以将一个正则表达式编译成为一个对象存储起来,使得我们可以复用这个正则表达式
pattern = re.compile(r"(<([a-zA-Z]+).*?>.*?</\2>)")
# 通过findall 可以将所有符合正则表达式的子字符串获取到
res = pattern.findall(data)
# 这里的正则表达式由于有括号,所以获取到的每一个元素是一个元组,元组的元素是小括号的匹配项
for ls in res:
print(ls)
# compile 函数可以将一个正则表达式编译成为一个对象存储起来,使得我们可以复用这个正则表达式
pattern = re.compile(r"<td.*?>.*?</td>")
# 通过findall 可以将所有符合正则表达式的子字符串获取到
res = pattern.findall(data)
# 这里的正则表达式由于没有括号,所以返回值是一个字符串,代表整个正则表达式的匹配项
for ls in res:
print(ls)
finditer()
import re
data = """<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table>
<tr>
<td>张三</td>
<td>男</td>
</tr>
<tr>
<td>李四</td>
<td>男</td>
</tr>
<tr>
<td>爱嘤斯坦</td>
<td>女</td>
</tr>
<tr>
<td>汤姆瑞斗</td>
<td>男</td>
</tr>
</table>
</body>
</html>
"""
# compile 函数可以将一个正则表达式编译成为一个对象存储起来,使得我们可以复用这个正则表达式
pattern = re.compile(r"<([a-zA-Z]+).*?>(.*?)</\1>")
# 通过finditer 可以将所有符合正则表达式的子字符串的match对象获取到
res = pattern.finditer(data)
# 这里的正则表达式由于没有括号,所以返回值是一个字符串,代表整个正则表达式的匹配项
for ls in res:
print(ls.group(1) + '\t' + ls.group(2) + '\t' + ls.group(0))
```
----
相关文章
* [《正则表达式 - Java篇》](http://lsf.lingyuzhao.top/LS-WebFront?/linkController=/articleController&link=-15790370 "《正则表达式 - Java篇》")
------
***操作记录***
作者:[root](http://www.lingyuzhao.top/index.html?search=1 "root")
操作时间:2023-12-08 10:37:31 星期五
事件描述备注:保存/发布
[](如果不需要此记录可以手动删除,每次保存都会自动的追加记录)