二、重复
正则表达式中提供了几种重复的方式,毕竟如果匹配三个字母使用“\w\w\w”的方式太不方便了,如果是三个还好,如果是十个、二十个呢。
*重复零次或者多次
+重复一次或者多次
?重复零次或者一次
{n}重复n次
{n,}重复n次或者更多次
{n,m}重复n次到m次。省略n,表示从0开始下限,省略m表示无限大上限。
“*“的用法
1
2
3
4
5
6
7
8
|
import re
string = 'test1234@gmail.com或13076879876电话'
pattern1 = re.compile(r'\w*')
pattern2 = re.compile(r'g*')
item1 = re.search(pattern1,string)
item2 = re.search(pattern2,string)
print(item1.group()) #输出test1234。重复多次\w,由于\w不匹配@。
print(item2.group()) #输出空。重复0次g。
|
”+“的用法
1
2
3
4
5
6
7
8
|
import re
string = 'test1234@gmail.com或13076879876电话'
pattern1 = re.compile(r'\w+')
pattern2 = re.compile(r'g+')
item1 = re.search(pattern1,string)
item2 = re.search(pattern2,string)
print(item1.group()) #输出test1234。重复多次\w,由于\w不匹配@。
print(item2.group()) #输出g。重复1次g。
|
”?“的用法
1
2
3
4
5
6
7
8
|
import re
string = 'test1234@gmail.com或13076879876电话'
pattern1 = re.compile(r'\w?')
pattern2 = re.compile(r'g?')
item1 = re.search(pattern1,string)
item2 = re.search(pattern2,string)
print(item1.group()) #输出t。重复1次\w,由于\w不匹配@。
print(item2.group()) #输出空。重复0次g。
|
”{n}“的用法:
1
2
3
4
5
6
7
8
9
10
11
|
import re
string = 'test1234@gggmail.com或13076879876电话'
pattern1 = re.compile(r'\w{5}')
pattern2 = re.compile(r'g{2}')
pattern3 = re.compile(r'g{4}')
item1 = re.search(pattern1,string)
item2 = re.search(pattern2,string)
item3 = re.search(pattern3,string)
print(item1.group()) #输出test1。
print(item2.group()) #输出gg。重复2次g。
print(item3) #最多只有三个g,不匹配g{4}。没有匹配结果。
|
执行以上程序会输出如下结果:
”{n,}“的用法:
1
2
3
4
5
6
7
8
9
10
11
|
import re
string = 'test1234@gggmail.com或13076879876电话'
pattern1 = re.compile(r'\w{5,}')
pattern2 = re.compile(r'g{2,}')
pattern3 = re.compile(r'g{4,}')
item1 = re.search(pattern1,string)
item2 = re.search(pattern2,string)
item3 = re.search(pattern3,string)
print(item1.group()) #输出test1234。
print(item2.group()) #输出ggg。重复3次g。
print(item3) #最多只有三个g,不匹配g{4}。没有匹配结果。
|
执行以上程序会输出如下结果:
”{n,m}“的用法:
1
2
3
4
5
6
7
8
9
10
11
|
import re
string = 'test1234@gggmail.com或13076879876电话'
pattern1 = re.compile(r'\w{5,7}')
pattern2 = re.compile(r'g{1,3}')
pattern3 = re.compile(r'g{1,10}')
item1 = re.search(pattern1,string)
item2 = re.search(pattern2,string)
item3 = re.search(pattern3,string)
print(item1.group()) #输出test123。匹配5-7个字母。
print(item2.group()) #输出ggg。重复3次g。
print(item3.group()) #只有三个ggg。g{1,10}虽然是匹配1到10次g,也是可以匹配的。输出ggg。重复3次g。
|
执行以上程序会输出如下结果:
三、特定字符查找
1、单字查找[]
[]用于指示一组字符。比如我们想查找是否存在字符a或b时,写作[ab]
“[]“的用法
1
2
3
4
5
|
import re
string = 'testa1234@gmail.com或testz5678@gmail.com'
pattern1 = re.compile(r'test[az]')
item1 = re.findall(pattern1,string)
print(item1)
|
执行以上程序会输出如下结果:
test[az]查找包含有testa或者testz的字符。
列在[]中的字符只匹配是否含有其中的字符,而[]中的写法也有很大的自由度。比如想匹配数字,可以不用写为[0123456789],而是写为[0-9],这两个的含义是相同的。同理,小写字母可以写为[a-z],大写字母可以写为[A-Z],匹配英文可以写为[a-zA-Z]。
1
2
3
4
5
6
7
8
|
import re
string = 'testa1234@gmail.com或testz5678@gmail.com或testz6678@gmail.com'
pattern1 = re.compile(r'test[a-z]')
pattern2 = re.compile(r'testz[0-5]') #[0-5]匹配数字0,1,2,3,4,5
item1 = re.findall(pattern1,string)
item2 = re.findall(pattern2,string)
print(item1)
print(item2)
|
执行以上程序会输出如下结果:
[‘testa’, ‘testz’, ‘testz’]
[‘testz5’]
2、分组查找()
如果我们想重复多个字符应该怎么办呢?我们可以使用小括号来指定子表达式(也叫做分组),我们也可以指定分组重复的次数。比如我想匹配一个IP地址,我们可以这样写:
1
2
3
4
5
|
import re
string="This computer's IP is 192.168.0.1"
pattern=r'(\d{1,3}\.){3}\d{1,3}'
item=re.search(pattern,string)
print(item.group())
|
执行以上程序会输出如下结果:
3、反义查找
我们已经知道几种查找的元字符了,但是如果我们就是不想要查找那几种字符怎么办呢。没关系,正则表达式还提供反义查找方式。
\W 匹配任意非\w的字符
\S 匹配任意非\s的字符
\D 匹配任意非\d的字符
\B 匹配任意非\b的字符
[^q] 匹配非q字符的部分
[^aeiou] 匹配非aeiou的部分
“\W”的用法:
1
2
3
4
|
string='qq14717287xx@qq.com&10010/10086'
pattern=r'\W+.{0,3}'
item=re.findall(pattern,string)
print(item)
|
运行结果是:
1
|
['@qq.', '&100', '/100']
|
“\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.findall(pattern1,string)
item2 = re.findall(pattern2,string)
print("无ASCII标志:",item1)
print("ASCII标志:",item2)
|
执行以上程序会输出如下结果:
1
2
|
无ASCII标志: []
ASCII标志: ['9876电']
|
“\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.findall(pattern1,string)
item2 = re.findall(pattern2,string)
print(item1)
print(item2) #输出[b'1234@']。
|
执行以上程序会输出如下结果:
“\S”的用法: 字符串Unicode
1
2
3
4
5
6
7
8
|
import re
string = 'test1234@gmail.com或13076879876电话'
pattern1 = re.compile(r'9876\S')
pattern2= re.compile(r'9876\S',re.ASCII)
item1 = re.findall(pattern1,string)
item2 = re.findall(pattern2,string)
print("无ASCII标志:",item1)
print("ASCII标志:",item2)
|
执行以上程序会输出如下结果:
1
2
|
无ASCII标志: ['9876电']
ASCII标志: ['9876电']
|
“\S”的用法: 字节Bytes
1
2
3
4
5
|
import re
string = b'test1234@gmail.com'
pattern = re.compile(rb'123\S')
item1 = re.findall(pattern,string)
print(item1) #[b'1234']
|
“\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.findall(pattern1,string)
item2 = re.findall(pattern2,string)
print("无ASCII标志:",item1)
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.findall(pattern1,string)
item2 = re.findall(pattern2,string)
print(item1)
print(item2)
|
执行以上程序会输出如下结果:
“\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.findall(pattern1,string)
item2 = re.findall(pattern2,string)
print(item1)
print(item2)
|
执行以上程序会输出如下结果:
“[^]”的用法:
1
2
3
4
5
6
7
8
|
import re
string = 'testa1234@gmail.com或testz5678@gmail.com'
pattern1 = re.compile(r'test[^a]')
pattern2 = re.compile(r'test[^az]')
item1 = re.findall(pattern1,string)
item2 = re.findall(pattern2,string)
print(item1)
print(item2)
|
执行以上程序会输出如下结果:
转载请注明本网址。