正则表达式符号介绍
正则表达式可以用来匹配字符串中满足某一种规律的字符串的工具,它主要由以下表格中的规则组成。
. | 匹配任意单个字符(除了换行符) | |
---|---|---|
* | 匹配前一个字符零次或连续多次 | a* 将匹配零个或多个连续的字母a |
? | 匹配前一个字符零次或一次 | a? 将匹配零个或一个字母a |
\ | 用于转译特殊字符,使其成为普通字符 | \\. 匹配真正的句点而不是任意字符 |
[] | 匹配括号内的任意字符 | [aeiou] 将匹配任何一个元音字母 |
[^] | 匹配除了括号内字符之外的任意一个字符 | [^aeiou] 将匹配任何一个非元音字母 |
| | 或运算符号,个模式之前进行选择 | a|b 匹配a 或者b |
+ | 匹配加号(+)之前的正则表达式1次或多次 | |
() | 可以改变表达式的结合顺序 | (ab)+ 将匹配一个或多个连续的ab |
^ | 匹配字符串的开始位置 | ^a 将匹配以字母a 开头的字符串 |
$ | 匹配字符串的结束位置 | a$ 将匹配以字母a 结尾的字符串 |
\d | 匹配任意一个数字字符 | 相当于[0-9] |
\D | 匹配任意一个非数字字符 | 相当于[^0-9] |
\w | 匹配任意一个字母、数字或下划线字符 | 相当于[a-zA-Z0-9_] |
\W | 匹配任意一个非字母、数字或下划线字符 | 相当于[^a-zA-Z0-9_] |
\s | 匹配任意一个空白字符,包括空格、制表符 | |
\S | 匹配任意一个非空白字符 | |
{n} | 指定匹配的字数为n次 | |
.*? | 非贪婪匹配任意字符 | 匹配尽可能少的字符,以满足整个正则表达式的匹配条件 |
Python实现正则匹配
匹配一次
如果需要匹配的内容是目标范围中唯一存在的,使用re.search
即可,可以减少开销
import re
# 使用re.search
pattern = r'<div>(.*?)</div>' # 匹配一个标签中的内容
text = 'li<div>123456</div><div>123456</div>li'
match = re.search(pattern, text, re.S)
if match:
print("找到匹配项:", match.group(1))
else:
print("未找到匹配项")
- 第5行
re.search
会在文本中寻找与模式匹配的第一个字符串。参数re.S
使得 . 可以匹配包括换行符在内的所有字符。 - 第7行
match.group(1)
用于获取正则模式中第一个括号匹配的内容,即标签中的内容运行结果:
找到匹配项: 123456
匹配多次
如果需要匹配的内容在目标范围中多次存在的,需要都匹配出来,这个时候需要使用
re.findall
方法。
demo如下:import re # 使用re.search pattern = r'<div>(.*?)</div>' # 匹配一个或多个数字 text = 'li<div>1</div> <div>2</div>li' match = re.findall(pattern, text, re.S) print(match)
运行结果:
['1', '2']
可以看到,已经将目标字符串中所有满足正则匹配条件的全部打印了出来
接着提高一些难度,现在有
'li<div id="1">1</div> <div id="1">2</div>li'
需要匹配其中的标签内的1和2import re # 使用re.search pattern = r'<div.*?>(.*?)</div>' # 匹配一个或多个数字 text = 'li<div id="1">1</div> <div id="2">2</div>li' match = re.findall(pattern, text, re.S) print(match)
- 第4行可以看到,为了将
id="1"
和id="2"
都匹配出来,所以再用了一个.*?
来解决
匹配URL内容
接下来需要实现匹配出
[https://www.yuque.com/justinpeiqi/dr9dgm/xsougc2r14qbu24r](https://www.yuque.com/justinpeiqi/dr9dgm/xsougc2r14qbu24r)
中的xsougc2r14qbu24r
编写代码:import re pattern = r'https://www.yuque.com/justinpeiqi/dr9dgm/(.*)' text = 'https://www.yuque.com/justinpeiqi/dr9dgm/xsougc2r14qbu24r' match = re.search(pattern, text, re.S) if match: print("找到匹配项:", match.group(1)) else: print("未找到匹配项")
- 第二行使用
.*
匹配[https://www.yuque.com/justinpeiqi/dr9dgm/](https://www.yuque.com/justinpeiqi/dr9dgm/)
之后的任意字符串
也可以用
r'[https://www.yuque.com/justinpeiqi/dr9dgm/(\w{27})'](https://www.yuque.com/justinpeiqi/dr9dgm/(.*)')
来匹配末尾27位字符来实现总结一下,灵活使用
(.*?)
可以解决很多匹配问题最后修改:2024 年 03 月 13 日© 禁止转载 - 第4行可以看到,为了将
此处评论已关闭