正则表达式首先调用re模块

import re

1、match方法

  match(pattern, string, flags=0)  #re.match的函数签名

match要求从开头匹配
a = re.match('test',  'test123')
print(a)

b = re.match('test', 'ltest1234')
print(b)
#b的结果为None,说明没有匹配到

2、search方法

search(pattern, string, flags=0)

search不需要从第一个字符开始匹配

a = re.search('test', 'test1234')
print(a)

b = re.search('test', 'lleatest4323')
print(b)

无论a和b都是可以匹配到的

 

3、元字符metacharacters

  .    表示匹配除换行符外的任意字符

  \w 表示匹配字母或数字或下划线或汉字

      \s   表示匹配任意空白字符,包括空格、制表符、换页付等

  \d 表示数字

  \b  匹配单词开始或结束

print(re.search('.....','hello'))
print(re.search('\w\w\w\w', 'a1_啥'))
print(re.search('\s\s', '\t\r'))
print(re.search('\d\d', '12'))

  ^匹配行首

      $匹配行尾

print(re.search('^h.*\w$','hello'))

  x|y 匹配x或者y

  [xyz] 匹配任意一个字符

  [a-z]匹配字符范围,也是匹配任意一个字符

print(re.search('a|e', 'abble'))
print(re.search('[a12]','abcd'))

 

4、重复

  ?匹配前面的字表达式零次或一次

  +匹配前面字表达式一次或者多次

  *匹配前面子表达式零次或者多次

  {n}重复n次

  {n,}最少重复n次

  {,m}最多重复m次

print(re.search('\d{5}', '12345'))
print(re.search('ca*t', 'cart'))
print(re.search('ca*t', 'cat'))
print(re.search('ca*t', 'caat'))

 

5、反义

[^x] 匹配除了x以外的任意字符

[^abc] 匹配除了abc这几个字母以外的任意字符

\W  匹配任意不是字母、数字、下划线、汉字的字符等价于[^A-Za-z0-9_]

\S 匹配任意不是空白的字符 等价于[^\f\n\r\t\v]

\D 匹配任意非数字的字符 [^0-9]

\B 匹配不是单词开头或者结束的位置

 

6、贪婪与懒惰

默认情况下正则表达式是贪婪模式

print(re.search('a.*b', 'aabab').group())
#aabab

 *? 重复任意次,但尽可能少重复

+?重复一次或多次,但是尽可能少重复

??重复0次或1次,但尽可能少重复

{n,m}? 尽可能少重复 n到m次

print(re.search('a.*?b', 'abadbadb').group())
#ab

 

7、编译标志

DOTALL, S  使 .匹配包括换行在内的所有字符

IGNORECASE, I  使匹配对大小写不敏感

LOCALE  L  使本地化识别匹配

MULTILINE, M 多行匹配影响^    $

VERBOSE,  X  详细状态

DEBUG  调试模式

print(re.search('.', '\n'))
#None

print(re.search('.', '\n', re.S))

print(re.search('a.', 'A\n', re.S|re.I))

 

8、编译正则表达式

regex = re.compile(r'^\d{1,3}$')

print(regex.match('12'))
print(regex.match('1234'))

 

9、检索替换

re.sub(pattern, repl, string, count=0, flags=0)

print(re.sub('\d+', '', 'test123'))
print(re.sub('\d', '', 'test123test13451tesa'))
#输出一样,说明替换不是只替换一次,而是贪婪模式,全部替换

print(re.sub('\d', '', 'test123', count=2))

 

10、findall/finditer

  findall会一次返回所有匹配的数值并放入列表,finditer会返回一个迭代器

print(re.findall('\d', '1a2b3c4d5e6'))

for i in re.finditer('\d', '1a2d3e4r5ft6rq'):
    print(i)

 

11、分组

m = re.compile(r'(a)b')
a = m.match('ab')
print(a.group(1))

m = re.compile(r'([a-c]+).*(\w)')
a = m.match('abcbde')
print(a.group(1), a.group(2), a.group(1, 2))

 

12、命名分组

(?P<name>正则表达式) #命名分组格式

pattern = '(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'

m = re.match(pattern, '2018-01-02')
print(m.groupdict())

 

posted on 2018-03-26 20:58  爱python的小皮  阅读(129)  评论(0编辑  收藏  举报