2019-03 Python正则表达式复习

1. 常见的函数

  1. re.match函数、re.search函数相比:search函数匹配的是全局的一次,而match是只匹配字符串的开始的一次,如果字符串开始不符合正则表达式,则匹配失败
s="12abc345ab"
m=re.match(r'\d{3,}',s)
print m    ## answer: None

m=re.search(r'\d{3,}',s)
print m.group()  ## answer: 345
  1. re.sub函数、re.subn函数(返回一个元组 (新字符串,替换次数) )
s="2004-938-323 # 市第十三ds大师级 "
num=re.sub(pattern=r'#.*$', repl='', string=s)  ## $表示字符的末尾,.*$表示匹配到末尾
print num  ## answer: 2004-938-323
num=re.sub(pattern=r'\D', repl='', string=s)  ## D表示非数字字符,大写的字母都是小写字母的反义
print num  ## answer: 2004938323
num=re.sub(pattern=r'\d', repl='', string=s)  ## d表示数字字符
print num  ## answer: -- # 市第十三ds大师级

def replace_func(matched):
    print matched.group()
    return "*" * len(matched.group())
s = "abc,123,ef"
num = re.sub(pattern=r'[a-z]+', repl=replace_func, string=s)
print num
## answer: abc
##         ef
##         ***,123,**
  1. re.compile函数
  2. findall函数 (匹配的所有子串,并返回一个列表)
  3. re.split函数 (用pattern做分隔符切分字符串,分割后返回列表)
s = "dog,dog,cat. "
print re.split(r'\W+', s) ## pattern=\W 表示非字母数字及下划线
                          ## answer: ['dog', 'dog', 'cat', '']
print re.split(r'(\W+)', s) ## (pattern)=(\W)表示连带分隔符一起返回
                            ## answer:['dog', ',', 'dog', ',', 'cat', '. ', '']

小结一下: 函数re.finditer 、re.match、re.search 返回匹配对象,而findall、split返回列表。

2. re.compile函数(生成一个 Pattern 对象,也就是对正则表达式进行编译)

## match
pattern = re.compile(r"([a-z]+) ([a-z]+)", re.I)    
m = pattern.match('hello nice world.')
print m.groups()   ## answer: ('hello', 'nice')
print m.group()    ## answer:  hello nice

## sub
pattern = re.compile(r"(\w+) (\w+)") ## \w可以匹配一个字母或数字, ()表示一个分组
s = "ni 123, hao 456"
m = pattern.sub(r'\2 \1', s)
print m      ## answer: 123 ni, 456 hao

小结:如果一个正则表达式要用多次,那么出于效率考虑,我们可以预先编译正则表达式,然后调用的一系列函数时复用。如果直接使用re.match、re.search等函数,则需要每一次都对正则表达式进行编译,效率就会降低。

3. 贪恋匹配

  正则表达式匹配时默认的是贪恋匹配,也就是会尽可能多的匹配更多字符。如果想使用非贪恋匹配,可以在正则表达式中加上'?'。

s = 'ahello worldbbbni haoccc'
pattern = re.compile(r'.*')
print pattern.findall(s)  ## answer: ['hello worldbbbni hao']

pattern = re.compile(r'.*?')
print pattern.findall(s)  ## answer: ['hello world', 'ni hao']

4. 分组

  如果你想要提取子串或是想要重复提取多个字符,那么你可以选择用定义分组的形式。用()就可以表示要提取的分组(group)。

pattern = re.compile(r'(\d{1,3}\.){3}\d{1,3}')  ## '(\d{1,3}\.){3}'表示匹配一个长度为1到3之间的数字子串加上一个英文句号的字符串,重复匹配 3 次该字符串,'\d{1,3}'表示匹配一个1到3位的数字子串
s = 'ab123.456.78.90c'
print pattern.search(s).group()  ## answer: 123.456.78.90

5. 正则表达式修饰符

  1. re.I :忽略大小写
  2. re.L :
  3. re.M:多行匹配
  4. re.S:单行匹配
  5. re.U:
  6. re.X:忽略多余空白字符

6. 常用语句

匹配中文表达式
pattern = re.compile(r'[^\u4e00-\u9fa5]+')
s = u'你好, hello, 世界 1'
print pattern.findall(s)

参考文献:

长文详解python正则表达式
廖雪峰正则表达式
字符串含义

你可能感兴趣的:(2019-03 Python正则表达式复习)