0x00 元字符
元字符是构造正则表达式的一种基本元素
0x01 常用元字符
元字符 | 解释 |
---|---|
. | 匹配除换行符以外的任意字符 |
\d | 匹配数字(等价于[0-9]) |
\D | 匹配非数字(等价于[^0-9]) |
\w | 匹配数字、字母、下划线(等价于[0-9a-zA-Z_]) |
\W | 匹配非数字字母下划线(等价于[^0-9a-zA-Z_]) |
\b | 匹配单词的开始或结束 |
\s | 匹配空白字符(等价于[\f\n\r\t\v]) |
\S | 匹配非空白字符(等价于[^\f\n\r\t\v]) |
^ | 匹配字符串的开始,放在模式中表示非 |
$ | 匹配字符串的结束 |
0x02空白元字符
元字符 | 解释 |
---|---|
\f | 换页符 |
\n | 换行符 |
\t | 制表符tab键 |
\r | 回车符 |
\v | 垂直制表符 |
[\b] | 回退并删除一个字符 |
注:在windows中经常使用\r\n来匹配文本行结束,在linux中可以使用\n 来匹配文本行结束
匹配空白行的正则表达式可以用 **[\r]?[\n][\r]?[\n]**表示
0x03特殊进制
-
在正则表达式中十六进制需要用前缀\x来表示。
-
在正则表达式中八进制需要用前缀\0来表示。
0x10 重复匹配
0x11 匹配一个或多个
要想匹配同一个字符的多次重复,只要在字符后加上”+“作为后缀就可以了。”+“匹配至少一次。比如[a-z]+ 表示匹配一个或多个连续的字母。
比如匹配一个简单的邮箱格式
test = "adjaisdjasod test@126.com. aaa.123@234.com djaidjqojwijdioqjwjdoq test@126.aaa.com"
content = re.findall(r'([\w.]+@[\w.]+\.\w+)', test)
print(content)
['test@126.com', 'test@126.aaa.com']
上面的表达式有一个严重的问题,如果出现文本 .test@126.com我们的表达式会失效
0x12 匹配0个或多个
如果想匹配一个可有可无的字符,只要在字符后加上”*“作为后缀就可以了。
继续拿邮箱作为例子
test = ".test@126.com."
content = re.findall(r'(\w+[\w.]*@[\w.]+\.\w+)', test)
print(content)
只需要将 . 字符变成一个可选就解决了上面所述的问题
0x13 匹配0个或1个
如果只想匹配0个或者1个字符,那么只需要在字符后加上“?”作为后缀就可以了。即 将贪婪的*+变成非贪婪,贪婪和非贪婪后面会总结。
比如我们想匹配一段html中的标签,如果只是用<.*> 就会变成贪婪匹配,即匹配了整个字符串。
test = '<p>123123</p>'
content = re.findall(r'(<.*>)', test)
print(content)
['<p>123123</p>']
如果我们加上 ? 将其变成非贪婪匹配,得到的就是单个标签了
test = '<p>123123</p>'
content = re.findall(r'(<.*?>)', test)
print(content)
['<p>', '</p>']
0x14 匹配n次
正则表达式中重复次数的语法用元字符{}表示。
-
如果想为重复匹配次数设定一个精准的次数,可以用{n}表示。{n} 意味着模式里前一个字符必须在原始文本里连续出现n次。
test = 'aabbcc123456' content = re.findall(r'[a-z]{3}', test) print(content) ['aab', 'bcc']
如果将上面的次数改为4次,
test = 'aabbcc123456'