10.python面试之正则表达式

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。

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

\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}

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

1
2
3
4
import re
s = "abbbccc"
pattern = r'b+'
print(re.sub(pattern, 'b', s))
abccc

Python字符串查找和替换?

  1. **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

  1. **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

  2. **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

  3. **str.rindex()**:倒序字符串查找函数

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

    函数原型:

    str.rindex(substr [, pos_start, [ pos_end ] ] )

    参数说明:

    str:代表原字符串

    substr:代表要查找的字符串

    pos_start:代表查找的开始位置,默认是从下标0开始查找

    pos_end:代表查找的结束位置

    例子:

    'adsfddf'.rindex('d') # 5

  4. 使用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的连续字符串进行替换,如果newpatstr,那么就是替换为newpat,如果newpat是函数,那么就按照函数返回值替换。sub函数两个有默认值的参数分别是count表示最多只处理前几个匹配的字符串,默认为0表示全部处理;最后一个是flags,默认为0
  1. 使用**replace()**进行替换:

基本用法:对象.replace(rgExp,replaceText,max)

其中,rgExp和replaceText是必须要有的,max是可选的参数,可以不加。

rgExp是指正则表达式模式或可用标志的正则表达式对象,也可以是 String 对象或文字;

replaceText是一个String 对象或字符串文字;

max是一个数字。

对于一个对象,在对象的每个rgExp都替换成replaceText,从左到右最多max次。

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

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

第一个代表贪心匹配,第二个代表非贪心;
?在一般正则表达式里的语法是指的”零次或一次匹配左边的字符或表达式”相当于{0,1}

而当?后缀于*,+,?,{n},{n,},{n,m}之后,则代表非贪心匹配模式,也就是说,尽可能少的匹配左边的字符或表达式,这里是尽可能少的匹配.(任意字符)

所以:第一种写法是,尽可能多的匹配,就是匹配到的字符串尽量长,第二中写法是尽可能少的匹配,就是匹配到的字符串尽量短。

比如<tag>tag>tag>end,第一个会匹配<tag>tag>tag>,第二个会匹配<tag>

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

贪婪模式:

定义:正则表达式去匹配时,会尽量多的匹配符合条件的内容

标识符:+?*{n}{n,}{n,m}

匹配时,如果遇到上述标识符,代表是贪婪匹配,会尽可能多的去匹配内容

非贪婪模式:

定义:正则表达式去匹配时,会尽量少的匹配符合条件的内容 也就是说,一旦发现匹配符合要求,立马就匹配成功,而不会继续匹配下去(除非有g,开启下一组匹配)

标识符:+???*?{n}?{n,}?{n,m}?

可以看到,非贪婪模式的标识符很有规律,就是贪婪模式的标识符后面加上一个?

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

1
2
3
4
s1='_aai0efe00'
res = re.findall(r'^[a-zA-Z_]+.*\d+$', s1)
print(res)

['_aai0efe00']

怎么过滤评论中的表情?

思路:主要是匹配表情包的范围,将表情包的范围用空替换掉

1
2
3
import re
pattern = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')
pattern.sub('',text)

简述Python里面search和match的区别

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