二、重复

正则表达式中提供了几种重复的方式,毕竟如果匹配三个字母使用“\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}。没有匹配结果。

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

1
2
3
test1
gg
None

”{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}。没有匹配结果。

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

1
2
3
test1234
ggg
None

”{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
2
3
test123
ggg
ggg

三、特定字符查找

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)

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

1
['testa', 'testz']

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())

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

1
192.168.0.1

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@']。

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

1
2
[]
[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)

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

1
2
[]
[b'1234@']

“\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
[]
['gmai']

“[^]”的用法:

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)

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

1
2
['testz']
[]

转载请注明本网址。