设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2704|回复: 1

python正则表达式基本用法

  [复制链接]

5

主题

63

金钱

111

积分

入门用户

发表于 2018-6-5 17:08:27 | 显示全部楼层 |阅读模式
正则表达式的基础知识
什么是正则表达式 : 它是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。

处理正则表达式相关的模块: import re

1.正则表达式相关 符号 的用法
(1) . : 任意字符
用法: 匹配一个第一个字符是a,第二个字符是任意字符,第三个字符是b的这样一个字符串
  1. restr = r'a.b'
  2. strstr = 'a-bab----===='
  3. result = match(restr, strstr)
  4. print(result)
  5. >>> <_sre.SRE_Match object; span=(0, 3), match='a-b'>
复制代码

(2) \w :字母、数字、下划线、中文
用法: 匹配第一个字符是l,第二个字符是字母、数字或者下划线,第三个字符是t的一个字符串
  1. restr = r'l\wt'
  2. strstr = 'l你tllll'
  3. result = match(restr, strstr)
  4. print(result)
  5. >>> <_sre.SRE_Match object; span=(0, 3), match='l你t'>
复制代码

(3) \s :空格、回车、制表符等(产生空白的字符)
用法: 匹配第一个字符是l,第二个字符是空白,第三个字符是t的一个字符串
  1. restr = r'l\st'
  2. #strstr = 'l_tllll'   >>> None
  3. strstr = 'l tllll'
  4. result = match(restr, strstr)
  5. print(result)
  6. >>> <_sre.SRE_Match object; span=(0, 3), match='l t'>
复制代码

(4) \d :匹配数字字符
用法: 匹配第一个字符是l,第二个字符是数字,第三个字符是t的一个字符串
  1. restr = r'l\dt'
  2. strstr = 'l0tssddd'
  3. result = match(restr, strstr)
  4. print(result)
  5. >>> <_sre.SRE_Match object; span=(0, 3), match='l0t'>
复制代码

(5) \b :匹配单词的边界(空格、逗号,句号,问号,冒号等…)
用法: 匹配一个第一个字符是数字,第二个字符是a,并且a后边是单词的边界的一个字符串
  1. restr = r'\b\da\b'
  2. strstr = '8a:pjuukk'
  3. result = match(restr, strstr)
  4. print(result)
  5. >>> <_sre.SRE_Match object; span=(0, 2), match='8a'>

  6. restr = r'aaa\s\b\da\b,p'
  7. strstr = 'aaa 8a,pooooo'
  8. result = match(restr, strstr)
  9. print(result)
  10. >>> <_sre.SRE_Match object; span=(0, 8), match='aaa 8a,p'>
复制代码

(6) ^ :匹配字符串的开始
用法: 匹配一个以the开头的字符串
  1. restr = r'^the'
  2. strstr = 'thekoojppp'
  3. result = match(restr, strstr)
  4. print(result)
  5. >>> <_sre.SRE_Match object; span=(0, 3), match='the'>
复制代码

(9) \S :匹配非空白字符
  1. restr = r'a\Sb'
  2. strstr = 'a7b000pppp'
  3. print(match(restr, strstr))
  4. >>> <_sre.SRE_Match object; span=(0, 3), match='a7b'>
复制代码

(10) \D :匹配非数字字符
  1. restr = r'\d\D'
  2. strstr = '8Lppppp'
  3. print(match(restr, strstr))
  4. >>> <_sre.SRE_Match object; span=(0, 2), match='8L'>
复制代码

(11) \B :非边界匹配
  1. restr = r'a\Babc\B'
  2. strstr = 'aabcppp'
  3. print(match(restr, strstr))
  4. >>> <_sre.SRE_Match object; span=(0, 4), match='aabc'>
复制代码

(12) [ ] :匹配字符集中的任意一个字符
用法: 匹配一个第一个字符a,第二个字符是b,c,d,t中的任意一个,第三个字符是数字
  1. restr = r'a[bcdt]\d'
  2. strstr = 'ac9llllll'
  3. print(match(restr, strstr))
  4. >>> <_sre.SRE_Match object; span=(0, 3), match='ac9'>
复制代码

(13) [^] :匹配不在字符集中的任意一个字符
  1. restr = r'a[^bcdt]\w'
  2. strstr = 'a,问llll'
  3. print(match(restr, strstr))
  4. >>> <_sre.SRE_Match object; span=(0, 3), match='a,问'>
复制代码

(14) * : X* 匹配X重复0次或者多次
用法: 匹配字符串开始是0个或者多个a字符,紧跟着bc这样的字符串
  1. restr = r'a*bc'
  2. strstr = 'aaabc'
  3. print(match(restr, strstr))
  4. >>> <_sre.SRE_Match object; span=(0, 5), match='aaabc'>

  5. restr = r'a\d*'
  6. strstr = 'a900pppp'
  7. print(match(restr, strstr))
  8. >>> <_sre.SRE_Match object; span=(0, 4), match='a900'>
复制代码

(15) + : X+ 匹配X重复1次或者多次
  1. restr = r'a+bc'
  2. strstr = 'aaabc,,,,'
  3. print(match(restr, strstr))
  4. >>> <_sre.SRE_Match object; span=(0, 5), match='aaabc'>
复制代码

(16) ? : X? 匹配X重复0次或者1次
  1. restr = r'a?bc'
  2. strstr = 'abc'
  3. print(match(restr, strstr))
  4. >>> <_sre.SRE_Match object; span=(0, 3), match='abc'>
复制代码

(17) X{N} : 匹配X重复N次 X{N,}:匹配X重复至少N次 X{M,N} : 匹配X重复M到N次
  1. restr = r'\d{5,6}'
  2. strstr = '8928990ppp'
  3. print(match(restr, strstr))
  4. >>> <_sre.SRE_Match object; span=(0, 6), match='892899'>
复制代码

(18) | :分支, 或者
用法: 可以匹配abc或者bpp
  1. restr = r'abc|bpp'
  2. strstr = 'bppkkkkk'
  3. print(match(restr, strstr))
  4. >>> <_sre.SRE_Match object; span=(0, 3), match='bpp'>

  5. restr = r'\d{5}\w|\w{5}[ymn]|R*\d.'
  6. strstr = '98764woooooo'
  7. strstr = 'ah67_yppppppp'
  8. strstr = 'RRRR9mppppp'
  9. print(match(restr, strstr))
  10. >>> <_sre.SRE_Match object; span=(0, 6), match='RRRR9m'>
复制代码

2. 正则表达式相关 函数 的用法
(1) compile()
编译正则表达式,返回一个正则表达式对象(没有检测正则表达式是否正确的功能)
  1. restr = r'b[1-9]{6}\w'
  2. reobject = re.compile(restr)
  3. print(reobject)
  4. >>> re.compile('b[1-9]{6}\\w')

  5. print(re.match(reobject, 'b889765wppppp'))
  6. >>> <_sre.SRE_Match object; span=(0, 8), match='b889765w'>
复制代码

(2) match()
通过指定的正则表达式去匹配指定的字符串,失败会返回None.成功返回匹配对象
  1. restr1 = r'aa\d*'
  2. print(re.match(restr1, 'aa67pppp'))
  3. >>> <_sre.SRE_Match object; span=(0, 4), match='aa67'>
复制代码

(3) search()
搜索字符串中第一次出现正则表达式的模式。找到就返回匹配对象,没找到返回None
  1. restr2 = r'a\db{2}'
  2. print(re.search(restr2, "bndha1bbdhjsjsa9bbppp"))
  3. >>> <_sre.SRE_Match object; span=(4, 8), match='a1bb'>
复制代码

(4) split()
maxsplit:控制拆分次数,如果是0,就是全部拆分
在字符串中以正则表达式匹配到的字符串为拆分点,对字符串进行拆分
  1. restr3 = r'\d'
  2. str_list = re.split(restr3, 'uuu h7hh jj k9k ll ii')
  3. print(str_list)
  4. >>> ['uuu h', 'hh jj k', 'k ll ii']
复制代码

(5) sub()
用指定的字符串替换原字符串中与正则表达式匹配的模式 可以用count指定替换的次数
  1. restr4 = r'[操肏艹草曹]|fuck|shit|煞笔|sb|SB|傻叉|Fuck|FUCK'
  2. strstr = '你丫是傻叉吗? 我操你大爷的. Fuck you.'
  3. new_str = re.sub(restr4, '*', strstr)
  4. print(new_str)
  5. >>> 你丫是*吗? 我*你大爷的. * you.
复制代码


(6) findall()
查找字符串所有与正则表达式匹配的模式 返回字符串的列表
  1. from re import findall

  2. def sum_num_seq(string):
  3.     total = 0
  4.     for val in map(int, findall(r'\d+', string)):
  5.         total += val
  6.     return total

  7. print(sum_num_seq('1h3ad4as5h6n'))
  8. print(sum_num_seq('8123917289'))

  9. >>>19
  10. >>>8123917289
复制代码

(7) $ :匹配字符串的结束
用法: 可以匹配or结尾的字符串
  1. restr = r'^the\d\wor
  2. (9) \S :匹配非空白字符
  3. [code]restr = r'a\Sb'
  4. strstr = 'a7b000pppp'
  5. print(match(restr, strstr))
  6. >>> <_sre.SRE_Match object; span=(0, 3), match='a7b'>
复制代码

(10) \D :匹配非数字字符
  1. restr = r'\d\D'
  2. strstr = '8Lppppp'
  3. print(match(restr, strstr))
  4. >>> <_sre.SRE_Match object; span=(0, 2), match='8L'>
复制代码

(11) \B :非边界匹配
  1. restr = r'a\Babc\B'
  2. strstr = 'aabcppp'
  3. print(match(restr, strstr))
  4. >>> <_sre.SRE_Match object; span=(0, 4), match='aabc'>
复制代码

(12) [ ] :匹配字符集中的任意一个字符
用法: 匹配一个第一个字符a,第二个字符是b,c,d,t中的任意一个,第三个字符是数字
  1. restr = r'a[bcdt]\d'
  2. strstr = 'ac9llllll'
  3. print(match(restr, strstr))
  4. >>> <_sre.SRE_Match object; span=(0, 3), match='ac9'>
复制代码

(13) [^] :匹配不在字符集中的任意一个字符
  1. restr = r'a[^bcdt]\w'
  2. strstr = 'a,问llll'
  3. print(match(restr, strstr))
  4. >>> <_sre.SRE_Match object; span=(0, 3), match='a,问'>
复制代码

(14) * : X* 匹配X重复0次或者多次
用法: 匹配字符串开始是0个或者多个a字符,紧跟着bc这样的字符串
  1. restr = r'a*bc'
  2. strstr = 'aaabc'
  3. print(match(restr, strstr))
  4. >>> <_sre.SRE_Match object; span=(0, 5), match='aaabc'>

  5. restr = r'a\d*'
  6. strstr = 'a900pppp'
  7. print(match(restr, strstr))
  8. >>> <_sre.SRE_Match object; span=(0, 4), match='a900'>
复制代码

(15) + : X+ 匹配X重复1次或者多次
  1. restr = r'a+bc'
  2. strstr = 'aaabc,,,,'
  3. print(match(restr, strstr))
  4. >>> <_sre.SRE_Match object; span=(0, 5), match='aaabc'>
复制代码

(16) ? : X? 匹配X重复0次或者1次
  1. restr = r'a?bc'
  2. strstr = 'abc'
  3. print(match(restr, strstr))
  4. >>> <_sre.SRE_Match object; span=(0, 3), match='abc'>
复制代码

(17) X{N} : 匹配X重复N次 X{N,}:匹配X重复至少N次 X{M,N} : 匹配X重复M到N次
  1. restr = r'\d{5,6}'
  2. strstr = '8928990ppp'
  3. print(match(restr, strstr))
  4. >>> <_sre.SRE_Match object; span=(0, 6), match='892899'>
复制代码

(18) | :分支, 或者
用法: 可以匹配abc或者bpp
  1. restr = r'abc|bpp'
  2. strstr = 'bppkkkkk'
  3. print(match(restr, strstr))
  4. >>> <_sre.SRE_Match object; span=(0, 3), match='bpp'>

  5. restr = r'\d{5}\w|\w{5}[ymn]|R*\d.'
  6. strstr = '98764woooooo'
  7. strstr = 'ah67_yppppppp'
  8. strstr = 'RRRR9mppppp'
  9. print(match(restr, strstr))
  10. >>> <_sre.SRE_Match object; span=(0, 6), match='RRRR9m'>
复制代码

2. 正则表达式相关 函数 的用法
(1) compile()
编译正则表达式,返回一个正则表达式对象(没有检测正则表达式是否正确的功能)
  1. restr = r'b[1-9]{6}\w'
  2. reobject = re.compile(restr)
  3. print(reobject)
  4. >>> re.compile('b[1-9]{6}\\w')

  5. print(re.match(reobject, 'b889765wppppp'))
  6. >>> <_sre.SRE_Match object; span=(0, 8), match='b889765w'>
复制代码

(2) match()
通过指定的正则表达式去匹配指定的字符串,失败会返回None.成功返回匹配对象
  1. restr1 = r'aa\d*'
  2. print(re.match(restr1, 'aa67pppp'))
  3. >>> <_sre.SRE_Match object; span=(0, 4), match='aa67'>
复制代码

(3) search()
搜索字符串中第一次出现正则表达式的模式。找到就返回匹配对象,没找到返回None
  1. restr2 = r'a\db{2}'
  2. print(re.search(restr2, "bndha1bbdhjsjsa9bbppp"))
  3. >>> <_sre.SRE_Match object; span=(4, 8), match='a1bb'>
复制代码

(4) split()
maxsplit:控制拆分次数,如果是0,就是全部拆分
在字符串中以正则表达式匹配到的字符串为拆分点,对字符串进行拆分
  1. restr3 = r'\d'
  2. str_list = re.split(restr3, 'uuu h7hh jj k9k ll ii')
  3. print(str_list)
  4. >>> ['uuu h', 'hh jj k', 'k ll ii']
复制代码

(5) sub()
用指定的字符串替换原字符串中与正则表达式匹配的模式 可以用count指定替换的次数
  1. restr4 = r'[操肏艹草曹]|fuck|shit|煞笔|sb|SB|傻叉|Fuck|FUCK'
  2. strstr = '你丫是傻叉吗? 我操你大爷的. Fuck you.'
  3. new_str = re.sub(restr4, '*', strstr)
  4. print(new_str)
  5. >>> 你丫是*吗? 我*你大爷的. * you.
复制代码


(6) findall()
查找字符串所有与正则表达式匹配的模式 返回字符串的列表
  1. from re import findall

  2. def sum_num_seq(string):
  3.     total = 0
  4.     for val in map(int, findall(r'\d+', string)):
  5.         total += val
  6.     return total

  7. print(sum_num_seq('1h3ad4as5h6n'))
  8. print(sum_num_seq('8123917289'))

  9. >>>19
  10. >>>8123917289
复制代码

0

主题

13

金钱

29

积分

新手用户

发表于 2018-9-20 09:41:45 | 显示全部楼层
很好!!!!!!!!!!!!!!!!!!!!!!!!1
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表