正则表达式也叫做匹配模式(Pattern),它由一组具有特定含义的字符串组成,通常用于匹配和替换文本。
在计算机科学中,用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。
Python为了方便大家对于正则的使用,专门为大家提供了re模块供我们使用
1. 正则的单个字符的匹配
表1.常用的元字符 | |
代码 | 说明 |
. | 匹配除换行符(\n)以外的任意字符 |
\w | 匹配大小写字母或数字或下划线或汉字0-9、a-z、A-Z、_(下划线)、汉字和其他国家的语言符号 |
\W | 匹配非字母或数字或下划线或汉字,跟\w正好相反 |
\s | 匹配任意的空白符 空格、tab、\n等 |
\S | 匹配任意非空白符 |
\d | 匹配数字 |
\D | 匹配非数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
[ ] | 匹配[]中列举的字符 |
1.1 . 匹配除换行符(\n)以外的任意字符
import re
t1 = re.match(".", "A")
t2 = re.match(".", "\n")
t3 = re.match(".", "_")
t4 = re.match(".", "#")
print(t1)
print(t2)
print(t3)
print(t4)
结果如下:
<_sre.SRE_Match object; span=(0, 1), match='A'>
<_sre.SRE_Match object; span=(0, 1), match='4'>
<_sre.SRE_Match object; span=(0, 1), match='_'>
None
1.2 \w 匹配大小写字母、数字、下划线、汉字及及其他国语言
t1 = re.match("\w", "A")
t2 = re.match("\w", "4")
t3 = re.match("\w", "_")
t4 = re.match("\w", "@")
print(t1)
print(t2)
print(t3)
print(t4)
结果如下:
<_sre.SRE_Match object; span=(0, 1), match='A'>
<_sre.SRE_Match object; span=(0, 1), match='4'>
<_sre.SRE_Match object; span=(0, 1), match='_'>
None
1.2' \W 匹配非字母、非数字、非下划线、非汉字及及其他国语言;刚好和\w相反
1.3 \s 匹配任意的空白符( 空格和制表符\t )
t1 = re.match("\s", " ")
t2 = re.match("\s", "\t")
t3 = re.match("\s", "_")
print(t1)
print(t2)
print(t3)
结果如下:
<_sre.SRE_Match object; span=(0, 1), match=' '>
<_sre.SRE_Match object; span=(0, 1), match='\t'>
None
1.3' \S 匹配任意的非空白符
1.4 \d 匹配数字
t1 = re.match("\d", "1")
t2 = re.match("\d", "a")
print(t1)
print(t2)
运行结果:
<_sre.SRE_Match object; span=(0, 1), match='1'>
None
1.4' \D 匹配非数字
1.5 \b 匹配单词的开始或结束
<span style="color:#3333ff"># 以.*开始 以liu结束
print(re.match(".*\\bliu\\b", "i is liu fas fsa5 662 2a"))</span>
运行结果:
<span style="color:#3333ff"><_sre.SRE_Match object; span=(0, 8), match='i is liu'></span>
2. ^、$和 [ ]
2.1 ^ 匹配字符串的开始
匹配以字符a开始的字符串
t1 = re.match("^a", "abcd")
print(t1)
结果如下:
<_sre.SRE_Match object; span=(0, 0), match=''>
2.2 $ 匹配字符串的结束
匹配以天气结尾的字符串
t1 = re.match(".*天气$", "今天是个好天气")
print(t1)
结果如下:
<_sre.SRE_Match object; span=(0, 7), match='今天是个好天气'>
2.3 [ ] 匹配[ ]中列举的字符
[a-zA-Z0-9]表示匹配大小写字母或0-9中的某个字符
t1 = re.match("[a-z0-9A-Z]", "Ahehe")
print(t1)
运行结果:
<_sre.SRE_Match object; span=(0, 1), match='A'>
[a-f]表示a-f中的某个字符,2-6表示2到6中的某个字符
2.4 匹配所有的汉字
[\u4e00-\u9fa5]可以匹配所有的字符
t1 = re.match("[\u4e00-\u9fa5]", "今天是个好天气")
print(t1)
运行结果:
<_sre.SRE_Match object; span=(0, 1), match='今'>
3. 字符转义
如果你想查找元字符本身的话,比如你查找 . 或者 * 就出现了问题:你没法指定它们,因为它们会被解释成其它的意思。这时你就必须使用\来取消这些字符的特殊意义。因此,你应该使用 \. 和 \* 。当然,要查找\本身,你也得用\\。
r 可以将\转化为普通的字符,使\不在具有转义字符的功能。\\表示\ , \表示转义字符
# error 报错,因为\\转义后就变成了\了
t1 = re.match("c:\\", "c:\\a\\b")
print(t1)
t2 = re.match("c:\\\\", "c:\\a\\b")
print(t2)
t3 = re.match(r"c:\\", "c:\\a\\b")
print(t3)
t1会报错,结果就不再展示,t2、t3运行结果
<_sre.SRE_Match object; span=(0, 3), match='c:\\'>
<_sre.SRE_Match object; span=(0, 3), match='c:\\'>
4.重复
能表示对个字符的常见正则表达式如下
表2.常用的限定符 | |
代码/语法 | 说明 |
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
4.1 * 匹配大于等于零个字符
* 和 .*
t1 = re.match("a*","aaabbbccc")
print(t1)
t2 = re.match("a.*","aaabbbccc")
print(t2)
运行结果如下
<_sre.SRE_Match object; span=(0, 3), match='aaa'>
<_sre.SRE_Match object; span=(0, 9), match='aaabbbccc'>
4.2 + 匹配的字符至少为一个
+ 和 .+
t1 = re.match("a+","abbbccc")
print(t1)
t2 = re.match("a.+","aaabbbccc")
print(t2)
运行结果如下
<_sre.SRE_Match object; span=(0, 1), match='a'>
<_sre.SRE_Match object; span=(0, 9), match='aaabbbccc'>
+和*是没有区别的,但 .+和 .*是有区别的
print(re.match("a.+", "a"))
print(re.match("a.*", "a"))
print(re.match("a*", "a"))
print(re.match("a+", "a"))
运行结果如下:
None
<_sre.SRE_Match object; span=(0, 1), match='a'>
<_sre.SRE_Match object; span=(0, 1), match='a'>
<_sre.SRE_Match object; span=(0, 1), match='a'>
4.3 ? 可以匹配一个字符也可以一个字符都不匹配
print(re.match("[0-9]?[\w]", "1"))
print(re.match("[0-9]?[\w]*", "aaa"))
[\w]", "1"))
print(re.match("[0-9]?[\w]*", "aaa"))
运行结果:
<span style="color:#3333ff"><_sre.SRE_Match object; span=(0, 1), match='1'>
<_sre.SRE_Match object; span=(0, 3), match='aaa'></span>
4.4 {n} 匹配n个同样的字符 ;{n,} 至少匹配n个字符;{n , m}匹配n-m个字符
print(re.match("\w{5,}", "abcd"))
print(re.match("\w{5}", "abcdefghijk"))
print(re.match("\w{5,}", "abcdefghijk"))
print(re.match("\w{5,10}", "abcdefghijk"))
运行结果如下
None
<_sre.SRE_Match object; span=(0, 5), match='abcde'>
<_sre.SRE_Match object; span=(0, 11), match='abcdefghijk'>
<_sre.SRE_Match object; span=(0, 10), match='abcdefghij'>
5. 反义
有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义:
表3.常用的反义代码 | |
代码/语法 | 说明 |
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
前三个已经说过,只介绍\B、[ ^x ] 和 [ ^aeious ]
5.1 [ ^x ]
print(re.findall("[^a]", "abcdefg"))
print(re.findall("[^abcd]", "awqcdefg"))
结果如下
['b', 'c', 'd', 'e', 'f', 'g']
['w', 'q', 'e', 'f', 'g']
6.
print(re.match(r'<(\w+)><(\w+)>.*</\2></\1>', '<html><h1>www.baidu.com</h1></html>').group())
运行结果:
<html><h1>www.baidu.com</h1></html>