python正则表达式篇

1、请写出一段代码用正则匹配出ip?

1
2
3
4
import re
ip ='192.168.1.1'
trueIp =re.search(r'(([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])\.){3}([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])',ip)
print(trueIp)

2、a = “abbbccc”,用正则匹配为abccc,不管有多少b,就出现一次?

1
2
3
思路:不管有多少个b替换成一个

re.sub(r'b+', 'b', a)

3、Python字符串查找和替换?

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
a、str.find():正序字符串查找函数
函数原型:
str.find(substr [,pos_start [,pos_end ] ] )
返回str中第一次出现的substr的第一个字母的标号,如果str中没有substr则返回-1,也就是说从左边算起的第一次出现的substr的首字母标号。

参数说明:
str:代表原字符串
substr:代表要查找的字符串
pos_start:代表查找的开始位置,默认是从下标0开始查找
pos_end:代表查找的结束位置

例子:
'aabbcc.find('bb')' # 2

b、str.index():正序字符串查找函数
index()函数类似于find()函数,在Python中也是在字符串中查找子串第一次出现的位置,跟find()不同的是,未找到则抛出异常。

函数原型:
str.index(substr [, pos_start, [ pos_end ] ] )

参数说明:
str:代表原字符串
substr:代表要查找的字符串
pos_start:代表查找的开始位置,默认是从下标0开始查找
pos_end:代表查找的结束位置

例子:
'acdd l1 23'.index(' ') # 4

c、str.rfind():倒序字符串查找函数

函数原型:
str.rfind( substr [, pos_start [,pos_ end ] ])
返回str中最后出现的substr的第一个字母的标号,如果str中没有substr则返回-1,也就是说从右边算起的第一次出现的substr的首字母标号。

参数说明:
str:代表原字符串
substr:代表要查找的字符串
pos_start:代表查找的开始位置,默认是从下标0开始查找
pos_end:代表查找的结束位置

例子:
'adsfddf'.rfind('d') # 5

d、str.rindex():倒序字符串查找函数
rindex()函数类似于rfind()函数,在Python中也是在字符串中倒序查找子串最后一次出现的位置,跟rfind()不同的是,未找到则抛出异常。

函数原型:
str.rindex(substr [, pos_start, [ pos_end ] ] )

参数说明:
str:代表原字符串
substr:代表要查找的字符串
pos_start:代表查找的开始位置,默认是从下标0开始查找
pos_end:代表查找的结束位置

例子:
'adsfddf'.rindex('d') # 5

e、使用re模块进行查找和替换:
函数 说明
re.match(pat, s) 只从字符串s的头开始匹配,比如(‘123’, ‘12345’)匹配上了,而(‘123’,’01234’)就是没有匹配上,没有匹配上返回None,匹配上返回matchobject
re.search(pat, s) 从字符串s的任意位置都进行匹配,比如(‘123’,’01234’)就是匹配上了,只要s只能存在符合pat的连续字符串就算匹配上了,没有匹配上返回None,匹配上返回matchobject
re.sub(pat,newpat,s) re.sub(pat,newpat,s) 对字符串中s的包含的所有符合pat的连续字符串进行替换,如果newpat为str,那么就是替换为newpat,如果newpat是函数,那么就按照函数返回值替换。sub函数两个有默认值的参数分别是count表示最多只处理前几个匹配的字符串,默认为0表示全部处理;最后一个是flags,默认为0
1
2
3
4
5
6
7
8
9
10
11
f、使用replace()进行替换:
基本用法:对象.replace(rgExp,replaceText,max)

其中,rgExp和replaceText是必须要有的,max是可选的参数,可以不加。
rgExp是指正则表达式模式或可用标志的正则表达式对象,也可以是 String 对象或文字;
replaceText是一个String 对象或字符串文字;
max是一个数字。
对于一个对象,在对象的每个rgExp都替换成replaceText,从左到右最多max次。

s1='hello world'
s1.replace('world','liming')

4、用Python匹配HTML tag的时候,<.*> 和 <.*?> 有什么区别

1
2
3
4
5
6
第一个代表贪心匹配,第二个代表非贪心;
?在一般正则表达式里的语法是指的"零次或一次匹配左边的字符或表达式"相当于{0,1}
而当?后缀于*,+,?,{n},{n,},{n,m}之后,则代表非贪心匹配模式,也就是说,尽可能少的匹配左边的字符或表达式,这里是尽可能少的匹配.(任意字符)

所以:第一种写法是,尽可能多的匹配,就是匹配到的字符串尽量长,第二中写法是尽可能少的匹配,就是匹配到的字符串尽量短。
比如<tag>tag>tag>end,第一个会匹配<tag>tag>tag>,第二个会匹配<tag>。

5、正则表达式贪婪与非贪婪模式的区别?

1
2
3
4
5
6
7
8
9
10
11
贪婪模式:
定义:正则表达式去匹配时,会尽量多的匹配符合条件的内容
标识符:+,?,*,{n},{n,},{n,m}
匹配时,如果遇到上述标识符,代表是贪婪匹配,会尽可能多的去匹配内容

非贪婪模式:
定义:正则表达式去匹配时,会尽量少的匹配符合条件的内容 也就是说,一旦发现匹配符合要求,立马就匹配成功,而不会继续匹配下去(除非有g,开启下一组匹配)
标识符:+?,??,*?,{n}?,{n,}?,{n,m}?
可以看到,非贪婪模式的标识符很有规律,就是贪婪模式的标识符后面加上一个?

参考文章:https://dailc.github.io/2017/07/06/regularExpressionGreedyAndLazy.html

6、写出开头匹配字母和下划线,末尾是数字的正则表达式?

1
2
3
s1='_aai0efe00'
res=re.findall('^[a-zA-Z_]?[a-zA-Z0-9_]{1,}\d$',s1)
print(res)

7、怎么过滤评论中的表情?

1
2
3
4
思路:主要是匹配表情包的范围,将表情包的范围用空替换掉
import re
pattern = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')
pattern.sub('',text)

8、简述Python里面search和match的区别

1
2
match()函数只检测字符串开头位置是否匹配,匹配成功才会返回结果,否则返回None;
search()函数会在整个字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。