一、元字符

正则表达式中的特殊字符被称作元字符,常用的元字符如下:

.(英文输入法下的点)

(英文输入法下的点) 在默认模式下,它匹配除换行符以外的任何1个字符。如果指定了dotall标志,与任何1个字符(包括换行符)匹配。

“.“的用法

1
2
3
4
5
import re
string = 'test1234@gmail.com或13076879876电话'
pattern = re.compile(r'1234.')
item = re.search(pattern,string)
print(item.group())  #输出1234@,@就是元字符.的作用

“.“的用法 dotall标志

1
2
3
4
5
6
7
8
9
import re
string = '''test1234
@gmail.com或13076879876电话'''
pattern1 = re.compile(r'1234..',re.DOTALL)
pattern2 = re.compile(r'1234..')
item1 = re.search(pattern1,string)
item2 = re.search(pattern2,string)
print("DOTALL标志:",item1.group())
print("无DOTALL标志:",item2)

执行以上程序会输出如下结果:

1
2
3
DOTALL标志: 1234
@
DOTALL标志: None

带有DOTALL标志的匹配的结果是1234加上换行符和@,换行符和@就是匹配模式..的作用。 不带有DOTALL标志的匹配的结果是空,因为1234后面的.是不能匹配换行符的。

\w

字符串(也就是Unicode)模式: 匹配数字、字母、下划线和其他文字字符(可以匹配汉字)。如果使用了ASCII标志,只能匹配数字0-9,下划线,小写字母a-z,大写字母A-Z。相当于[a-zA-Z0-9]。 字节(也就是ASCII)模式: 相当于[a-zA-Z0-9]。如果使用了LOCALE标志,则匹配当前区域设置中被视为字母数字的字符和下划线。

“\w”的用法: 字符串Unicode

1
2
3
4
5
6
7
8
import re
string = 'test1234@gmail.com或13076879876电话'
pattern1 = re.compile(r'9876\w')
pattern2= re.compile(r'9876\w',re.ASCII)
item1 = re.search(pattern1,string)
item2 = re.search(pattern2,string)
print("无ASCII标志:",item1.group())
print("ASCII标志:",item2)

执行以上程序会输出如下结果:

1
2
ASCII标志: 9876
ASCII标志: None

“\w”的用法: 字节Bytes

1
2
3
4
5
6
7
8
import re
string = b'test1234@gmail.com'
pattern1 = re.compile(rb'123\w')
pattern2= re.compile(rb'1234\w')
item1 = re.search(pattern1,string)
item2 = re.search(pattern2,string)
print(item1.group())  #输出b'1234'。\w匹配数字4.
print(item2)  #输出None。@不是[a-zA-Z0-9_]范围内的,\w不匹配,没有匹配结果。

\s

字符串(也就是Unicode)模式: 匹配Unicode空白字符(包括[\t\n\r\f\v]以及许多其他字符,例如许多语言中排版规则强制使用的不间断空格)。如果使用ASCII标志,则仅匹配[\t\n\r\f\v]。其中\t是横向制表符,\n是换行,\r是回车,\v是纵向制表符,\f是换页。

字节(也就是ASCII)模式: 匹配ASCII字符集中被视为空白的字符;这相当于[\t\n\r\f\v]。

“\s”的用法: 字符串Unicode

1
2
3
4
5
6
7
8
import re
string = 'test1234@gmail.com或13076879876 电话'
pattern1 = re.compile(r'9876\s\w')
pattern2= re.compile(r'9876\s\w',re.ASCII)
item1 = re.search(pattern1,string)
item2 = re.search(pattern2,string)
print("无ASCII标志:",item1.group())
print("ASCII标志:",item2)

执行以上程序会输出如下结果:

1
2
ASCII标志: 9876 
ASCII标志: None

pattern1中,\s匹配了一个空格,\w匹配了’电’这个字。 pattern2中,由于使用了ASCII标志,虽然\s匹配了一个空格,但\w是不能匹配’电’这个字。

“\s”的用法: 字节Bytes

1
2
3
4
5
6
7
8
import re
string = b'test123 4@gmail.com'
pattern1 = re.compile(rb'123\s\w')
pattern2= re.compile(rb'123\s\w\w')
item1 = re.search(pattern1,string)
item2 = re.search(pattern2,string)
print(item1.group())  #输出b'123 4'。\s匹配空格。\w匹配数字4.
print(item2)  #输出None。@不是[a-zA-Z0-9_]范围内的,第二个\w不匹配,没有匹配结果。

执行以上程序会输出如下结果:

1
2
b'123 4'
None

\d

字符串(也就是Unicode)模式: 匹配任何Unicode十进制数字(即Unicode字符类别[nd]中的任何字符)。这包括[0-9]和许多其他数字字符。如果使用ASCII标志,则仅匹配[0-9]。

字节(也就是ASCII)模式: 匹配任何十进制数字;这相当于[0-9]。

“\d”的用法: 字符串Unicode

1
2
3
4
5
6
7
8
import re
string = 'test1234@gmail.com或130768798761电话'
pattern1 = re.compile(r'9876\d')
pattern2= re.compile(r'9876\d',re.ASCII)
item1 = re.search(pattern1,string)
item2 = re.search(pattern2,string)
print("无ASCII标志:",item1.group())
print("ASCII标志:",item2)

执行以上程序会输出如下结果:

1
2
ASCII标志: 98761
ASCII标志: None

pattern1中,\d匹配了一个日语输入法下的全角数字1。 pattern2中,由于使用了ASCII标志,\d不能匹配日语输入法下的全角数字1。

“\d”的用法: 字节Bytes

1
2
3
4
5
6
7
8
import re
string = b'test1234@gmail.com'
pattern1 = re.compile(rb'123\d')
pattern2= re.compile(rb'1234\d')
item1 = re.search(pattern1,string)
item2 = re.search(pattern2,string)
print(item1.group())  #输出b'1234'。\d匹配数字4.
print(item2)  #输出None。@不是[a-zA-Z0-9_]范围内的,\d不匹配,没有匹配结果。

执行以上程序会输出如下结果:

1
2
b'1234'
None

\b

匹配单词的开始或结束。

“\b”的用法:

1
2
3
4
5
6
7
8
import re
string = 'test 1234@gmail.com或13076879876电话'
pattern1 = re.compile(r'gmail\b')
pattern2= re.compile(r'gmai\b')
item1 = re.search(pattern1,string)
item2 = re.search(pattern2,string)
print(item1.group())  #gmail是完整的单词,和gmail\b是相匹配的。
print(item2)  #gmai不是一个完整的单词,和gmail\b是不相匹配的。

执行以上程序会输出如下结果:

1
2
gmail
None

^

匹配字符串的开始。如果使用MULTILINE标志,称之为多行模式,则匹配每行。 ^\d表示必须以数字开头。

“^”的用法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import re
string1 = 'test 1234@gmail.com或13076879876电话'
string2 = '''test 1234@gmail.com或
13076879876电话'''
pattern1 = re.compile(r'^test')
pattern2= re.compile(r'^130',re.MULTILINE)
item1 = re.search(pattern1,string1)
item2 = re.search(pattern2,string2)
print("无MULTILINE标志:",item1.group())
print("MULTILINE标志:",item2.group())

执行以上程序会输出如下结果:

1
2
MULTILINE标志: test
MULTILINE标志: 130

$

匹配字符串的结尾或字符串结尾处的换行符之前。在多行模式下(使用MULTILINE标志),匹配每行的换行符之前。foo同时匹配“foo”和“foobar”,而正则表达式foo$只匹配“foo”。更有趣的是,在“foo1\nfoo2\n”中搜索foo.$通常与“foo2”匹配,但在多行模式下匹配“foo1”;在“foo\n”中搜索单个$将找到两个(空)匹配项:一个位于换行符之前,一个位于字符串末尾。 \d$表示必须以数字结束。

“$”的用法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import re
string1 = 'foo'
string2 = 'foobar'
string3 = 'foo1\nfoo2\n'
string4 = 'foo\n'

pattern1 = re.compile(r'foo')
pattern2 = re.compile(r'foo$')
pattern3= re.compile(r'foo.$')
pattern4= re.compile(r'foo.$',re.MULTILINE)
pattern5= re.compile(r'$')

item1 = re.search(pattern1,string1)
item2 = re.search(pattern1,string2)
item3= re.search(pattern2,string1)
item4 = re.search(pattern2,string2)

item5 = re.search(pattern3,string3)
item6 = re.search(pattern4,string3)
item7= re.findall(pattern5,string4)

print("foo匹配foo的结果:",item1.group())
print("foo匹配foobar的结果:",item2.group())
print("foo$匹配foo的结果:",item3.group())
print("foo$匹配foobar的结果:",item4)
print("foo.$匹配foo1\\nfoo2\\n的结果:",item5.group())
print("foo.$匹配foo1\\nfoo2\\n的结果(MULTILINE标志):",item6.group())
print("$匹配foo\\n的结果:",item7)   #findall方法,返回的值是个列表,并且返回字符串中所有匹配的字符串。

执行以上程序会输出如下结果:

1
2
3
4
5
6
7
foo匹配foo的结果: foo
foo匹配foobar的结果: foo
foo$匹配foo的结果: foo
foo$匹配foobar的结果: None
foo.$匹配foo1\nfoo2\n的结果: foo2
foo.$匹配foo1\nfoo2\n的结果(MULTILINE标志): foo1
$匹配foo\n的结果: ['', '']

(特殊)转义字符。如果需要匹配的内容含有元字符本身的,需要使用转义字符进行转义。

“\“的用法:

1
2
3
4
5
6
7
8
import re
string = 'test1234@gmail.com或13076879876$电话'
pattern1 = re.compile(r'9876\$电话')
pattern2= re.compile(r'9876$')
item1 = re.search(pattern1,string)
item2 = re.search(pattern2,string)
print(item1.group())
print(item2)

执行以上程序会输出如下结果:

1
2
9876$电话
None

\A

匹配字符串的开头。

“\A”的用法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import re
string = 'test1234@gmail.com或13076879876$电话'
pattern1 = re.compile(r'\A')
pattern2= re.compile(r'\At')
pattern3= re.compile(r'\Ae')
item1 = re.findall(pattern1,string)
item2 = re.findall(pattern2,string)
item3 = re.findall(pattern3,string)
print(item1)
print(item2)
print(item3)

执行以上程序会输出如下结果:

1
2
3
['']
['t']
[]

注意,item1和item3的区别。item1是找到一个匹配结果,[“]也就是字符串开头。item3是没有匹配结果,[]是空。

\Z

匹配字符串的结尾。

“\Z”的用法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import re
string = 'test1234@gmail.com或13076879876$电话'
pattern1 = re.compile(r'\Z')
pattern2= re.compile(r'话\Z')
pattern3= re.compile(r'电\Z')
item1 = re.findall(pattern1,string)
item2 = re.findall(pattern2,string)
item3 = re.findall(pattern3,string)
print(item1)
print(item2)
print(item3)

执行以上程序会输出如下结果:

1
2
3
['']
['话']
[]

注意,item1和item3的区别。item1是找到一个匹配结果,[“]也就是字符串结果。item3是没有匹配结果,[]是空。


转载请注明本网址。