一、元字符
正则表达式中的特殊字符被称作元字符,常用的元字符如下:
.(英文输入法下的点)
(英文输入法下的点) 在默认模式下,它匹配除换行符以外的任何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不匹配,没有匹配结果。
|
执行以上程序会输出如下结果:
\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不匹配,没有匹配结果。
|
执行以上程序会输出如下结果:
\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是不相匹配的。
|
执行以上程序会输出如下结果:
^
匹配字符串的开始。如果使用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)
|
执行以上程序会输出如下结果:
\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)
|
执行以上程序会输出如下结果:
注意,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)
|
执行以上程序会输出如下结果:
注意,item1和item3的区别。item1是找到一个匹配结果,[“]也就是字符串结果。item3是没有匹配结果,[]是空。
转载请注明本网址。