正则表达式符号介绍

正则表达式可以用来匹配字符串中满足某一种规律的字符串的工具,它主要由以下表格中的规则组成。

.匹配任意单个字符(除了换行符)
*匹配前一个字符零次或连续多次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和2

import 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 日
如果觉得我的文章对你有用,请随意赞赏