2018-09-11 day17-正则表达式

正则表达式

python关于正则的支持
  • 提供内置模块re
  • fullmatch(正则表达式, 字符串) - 判断字符串是否正则表达式的规则
具体内容
表示方法 解析
.(点) 匹配任意一个字符
\w 匹配一个字母a-zA-Z、数字0-9或下划线_
\s 匹配一个空白字符(空格、制表符\t、换行符\r和回车\n)
\d 匹配一个数字字符0-9
\b 检测是否是单词边界(单词的开始、结尾、单词和单词之间的字符、空白)
^ 检测字符串是否以指定的正则表达式开头
$ 检测字符串是否以指定的正则表达式结束
\W 匹配一个非字母、数字或下划线的字符
\S 匹配一个非空白字符
\D 匹配一个非数字字符
\B 检测一个非单词边界
匹配次数 解析**
[] 匹配括号中出现的任意字符,一个中括号中匹配一个字符
-(负号) 在正则表达式的中括号里应用,两边的字符是对应的unicode码(含ASCII码)对应的字符
[^字符集] 匹配不再[]中出现的任意一个字符
* 可以匹配0次或多次字符(其前面的字符)
+ 可以匹配1次或多次字符(前面)
? 可以匹配0次或1次
{N} 匹配N次字符
{N,} 最少匹配N次
{,N} 最多匹配N次
{M,N} 可匹配最少M次,最多N次
注意 次数相关的操作,都是约束次数符号的前一个的字符

分支和分组

  • | 分支(相当于逻辑运算的or)
a3str = r'[a-zA-Z]{3}|\d{3}' #三个字母或数字
print(fullmatch(a3str,'123'))
print(fullmatch(a3str,'abc'))
a3str = r'\d{3}[a-z]{3}|[A-Z]{6}' #|左右分成两部分,即123abc或ASDQWE均成立
# 含分支操作时,只要有一个符合条件就不再使用后续的其他条件
a4str = 'abc12.5hhh60,30.2kkk9nn0.12'
print(findall('\d+[.]\d+|[1-9]\d+',a4str))

result;
<_sre.SRE_Match object; span=(0, 3), match='123'>
<_sre.SRE_Match object; span=(0, 3), match='abc'>
['12.5', '60', '30.2', '0.12']

  • 分组

1.通过()对正则表达式进行分组操作

a4str = r'([a-z]{2}\d{2}){3}' #两个字母两个数字连续出现3次
print(fullmatch(a4str,'ad13ad12as32'))

result:
<_sre.SRE_Match object; span=(0, 12), match='ad13ad12as32'>

2.重复,可以通过 \数字 来重复一次前面括号中匹配的结果,数字的值代表前面的第几个分组

a4str = r'(\d{2}[a-z])(\d{3})\1'
print(fullmatch(a4str,'12q55512q'))

result:
<_sre.SRE_Match object; span=(0, 9), match='12q55512q'>

3.捕获,按照完整的正则表达式去匹配,去捕获()中的内容。只有在findall中有效

a4str = r'a(\d{3})b'
print(findall(a4str,'da124bob341a'))

result:
['124']

正则表达式的转义

  • 正则表达式的转义和字符串的转义没有任何关系,在Python中字符串前加r阻止的是字符串的转义,不能阻止正则表达式的转义
  • 在正则表达式中,可以通过在有特殊意义的符号前加\来表示符号本身
如: \+ \- \. \* \? \\(\本身) \( \) \^ \$ \|

注意: 
a. - 只有在中括号里的两个字符之间才有特殊的意义
b. 如果特殊符号放到[]作为字符集的内容,那么除了-在两个字符间以外其他不需要转义
c. \ 不管放在何处都需要转义, ^放在中括号里的最前面需要转义(转义后就是单纯的字符)
  • 例子
a2tr = r'[abc\\]{3}'
print(fullmatch(a2tr,'\\ac'))
print(fullmatch(a2tr,r'\ac'))

result:(\\ 与 前r效果一样)
<_sre.SRE_Match object; span=(0, 3), match='\\ac'>
<_sre.SRE_Match object; span=(0, 3), match='\\ac'>

re 模块

  • compile(正则表达式) - 将正则表达式转换成正则表达式对象
re_str = r'\d+'
re_object = re.compile(re_str)
print(re_object,type(re_object))

# 不转换成正则表达式对象,调用函数
re.fullmatch(re_str,'123asd')
# 转换成正则表达式,调用函数
re_object.fullmatch('123asd')

result:
re.compile('\\d+') 
  • match(正则表达式, 字符串)--只判断字符串的开头是否能够和正则表达式匹配
  • fullmatch(正则表达式, 字符串)--判断整个字符串是否能够和正则表达式匹配
# 返回值都是匹配结果,如果匹配成功返回匹配对象,否则返回None


re_str = r'abc\d{3}'
match = re.match(re_str,'abc123456')
match2 = re.fullmatch(re_str,'abc123')
# a.匹配到的范围。匹配结果字符单位下标范围
print(match.span(),match2.span())
#获取起点和终点
print(match.start(),match.end())
# 正则表达式有分组时,span()函数中的group参数指定特定分组相应的结果
re_str = r'(\d{3})\+([a-z]{3})'
match1 = re.match(re_str,'123+qwe001')
print(match1,match1.span(),match1.span(1),match1.span(2))
# b.获取匹配结果对应的字符串
print(match1.group(),match1.group(1),match1.group(2))

# c.获取被匹配的原字符串
print(match1.string)

result:
(0, 6) (0, 6)
0 6
<_sre.SRE_Match object; span=(0, 7), match='123+qwe'> (0, 7) (0, 3) (4, 7)
123+qwe 123 qwe
123+qwe001
  • search(正则表达式, 字符串)-在字符串中查找第一个满足正则表达式的子串,若找到返回匹配对象,否则返回None
search1 = re.search(r'\d+Zz','hello my son,5Zz')
print(search1)

result:
<_sre.SRE_Match object; span=(13, 16), match='5Zz'>
  • split(正则表达式, 字符串) - 按满足正则表达式的子串去切割字符串,返回列表
str2 = '锄禾日当午,汗滴禾下土。谁知盘中餐,粒粒皆辛苦。'
result = re.split(r'[,,。.]',str2)
result2 = re.split(r'\W',str2)
print(result[:-1])
print(result2)#中文的输入也在\w以内

result:
['锄禾日当午', '汗滴禾下土', '谁知盘中餐', '粒粒皆辛苦']
['锄禾日当午', '汗滴禾下土', '谁知盘中餐', '粒粒皆辛苦', '']
  • sub(正则表达式,替换字符串,被替换的字符串)
word = '你丫是傻逼吗?我操死你大爷。挂机死全家'
result3 = re.sub(r'傻逼|操|死|挂机','?',word)
print(result3)

result:
你丫是?吗?我??你大爷。??全家
  • findall(正则表达式, 字符串) - 获取字符串中所有满足正则表达式的子串,返回值是列表。注意: 分组中的捕获效果在findall中有效
result4 = re.findall(r'\d([a-z]+)','对滴2abc光明0iop')
print(result4)

result:
['abc', 'iop']

你可能感兴趣的:(2018-09-11 day17-正则表达式)