python 可以通过正则表达式对字符进行匹配
需要 re 模块
例如
ret=re.match(".*","abc")
print(ret.group())
print(ret)
print(ret.string)#待匹配的文本
输出
abc
<re.Match object; span=(0, 3), match='abc'>
abc
这里列举一些正则表达式的匹配规则
匹配单个字符
字符 | 意义 |
---|---|
. | 匹配任意字符,除了(\n) |
[] | 匹配[]中列举的字符 |
\d | 匹配数字0-9 |
\D | 匹配非数字 |
\s | 匹配空白 就是匹配空白和tab键 |
\S | 匹配非空白 |
\w | 匹配单词字符 a-z A-Z 0-9 _ |
\W | 匹配非单词的字符 |
匹配多个字符
字符 | 意义 |
---|---|
* | 匹配前一个字符出现0次或者多次 >=0 |
+ | 匹配前一个字符出现次数 >=1 |
? | 匹配前一个字符出现1次或者没有 0 or 1 |
{m} | 匹配前一个字符出现m次 |
{m,n} | 匹配前一个字符出现m-n次 |
匹配分组
字符 | 意义 |
---|---|
| | 匹配左右任意一个表达式 |
(ab) | 将括号中的字符作为一个分组 |
\num | 引用分组num匹配到的字符串 |
(?P<name> ) | 分组起别名 |
(?P=<name> ) | 引用分组为name分组匹配到的字符串 |
使用re模块中的match方法之后,会返回一个match对象
Match对象的属性
属性 | 说明 |
---|---|
.string | 待匹配的文本 |
.re | 匹配时使用的patter对象(正则表达式) |
.pos | 正则表达式搜索文本的开始位置 |
.endpos | 正则表达式搜索文本的结束位置 |
Match对象的方法
方法 | 说明 |
---|---|
.group() | 获得匹配后的字符串 |
.start() | 匹配字符串在原始字符串的开始位置 |
.end() | 匹配字符串在原始字符串的结束位置 |
.span() | 返回(.start(), .end()) |
用 ^ 和 $ 符号来代表开头和结尾
例1:
import re
ret=re.match("^1\w*","123dsafsdajf")
#表示以1为开头,后面接单词字符任意次
print(ret.group())
输出
123dsafsdajf
例2:
import re
ret=re.match("^2\w*","123dsafsdajf")
print(ret.group())
输出:(没有匹配到什么东西)
AttributeError: 'NoneType' object has no attribute 'group'
例3:
import re
ret=re.match("\w*d$","123dsafsdad")
#表示以d结尾
print(ret.group())
输出:
123dsafsdad
例4:
import re
ret=re.match("\w*?d","123dsafsdajf")
#问号表示非贪婪算法,选取尽量少的匹配
print(ret.group())
输出:
123d
匹配分组
下面这个例子利用分组从一堆字符串中筛选出我想要的片段
import re
ret=re.match("([^2]*)-(\d+)","1914-139999999999")
print(ret.group(1))
print(ret.group(2))
输出:
1914
139999999999
使用\num引用分组的方法
urlnames=["<html><h1>hhh</h1></html>","<html><h1>hhh</h2></html>"]
for ul in urlnames:
ret=re.match(r"<(\w*)><(\w*)>.*</\2></\1>",ul)
# \1 ,\2表示引用之前的分组
if ret:
print("%s是成功的"%ret.group())
else:
print("错误")
输出:(因为html里面的开始标签和关闭标签必须一样)
<html><h1>hhh</h1></html>是成功的
错误
给分组起别名
ret=re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>","<html><h1>hhh</h1></html>")
print(ret.group())
输出
<html><h1>hhh</h1></html>
贪婪匹配和非贪婪匹配
默认都是贪婪匹配,即尽可能匹配多的字符,贪婪变非贪婪加一个 ? 符号
import re
ret=re.match(r"aa(\d+?)","aa123123adasd")
print(ret.group(1))
输出:1
虽然1后面还是\d类型,但是不会继续匹配。