正则表达式

正则表达式内部函数详解http://www.runoob.com/python/python-reg-expressions.html
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。
re 模块使 Python 语言拥有全部的正则表达式功能。
compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。
本章节主要介绍Python中常用的正则表达式处理函数。

>>> "abcde".find("b")
1
>>> "abcde".find("bc")
1
>>> "abcde".split("b")
['a', 'cde']
>>> "abcd".replace("ab","ee")
'eecd'
>>>

字符匹配(普通字符,元字符):

  普通字符:

  大多数字符和字母都会和自身匹配

>>> re.findall("alex","yuanaleSxalexwupeiqi")
['alex']
>>> re.findall("alex","yuanaleSxalewxwupeiqi")
[]
>>> re.findall("alex","yuanaleSxalexwupeiqialex")
['alex', 'alex']

元字符

):. ^ $ * + ? {} [] | () \

.   :匹配一个除了换行符任意一个字符

>>> re.findall("alex.w","aaaalexaw")
['alexaw']

#一个点只能匹配一个字符

^  :只有后面跟的字符串在开头,才能匹配上

>>> re.findall("alex.w","aaaalexaw")
['alexaw']

#"^"这个符号控制开头,所以写在开头

$  :只有它前面的字符串在检测的字符串的最后,才能匹配上

>>> re.findall("alex$","alexyuanaleSxalexwupeiqi")
[]
>>> re.findall("alex$","alexyuanaleSxalexwupeiqialex")
['alex']

*  :它控制它前面那个字符,他前面那个字符出现0到多个都可以匹配上

>>> re.findall("alex*","aaaale")
['ale']
>>> re.findall("alex*","aaaalex")
['alex']
>>> re.findall("alex*","aaaalexxxxxxxxx")
['alexxxxxxxxx']
#如果想控制多个字符就把那几个字符用括号括起来???? >>> re.findall("(alex)*","aaaalexexexex")
['', '', '', 'alex', '', '', '', '', '', '', '']

+  :匹配前面那个字符1到多次

>>> re.findall("alex+","aaaalexxxxxxxxx")
['alexxxxxxxxx']
>>> re.findall("alex+","aaaalex")
['alex']
>>> re.findall("alex+","aaaale")
[]

?  :匹配前面那个字符0到1个,多余的只匹配一个

>>> re.findall("alex?","aaaale")
['ale']
>>> re.findall("alex?","aaaalex")
['alex']
>>> re.findall("alex?","aaaalexxxxxx")
['alex']

{}  :控制匹配个数,可以有区间(闭区间)

>>> re.findall("alex{3}","aaaalexxxxxx")
['alexxx']
>>> re.findall("alex{3}","aaaalexx")
[]
>>> re.findall("alex{3}","aaaale")
[]
>>> re.findall("alex{3}","aaaalexxx")
['alexxx'] >>> re.findall("alex{3,5}","aaaalexxxxxxxxx")
['alexxxxx']
>>> re.findall("alex{3,5}","aaaalexxx")
['alexxx']
>>> re.findall("alex{3,5}","aaaalexx")
[]

[]  :控制匹配字符,[bc]意思是这个地方可以是b,也可以是c,但不能是bc因为是

b或c
>>> re.findall("a[bc]d","aaaabd")
['abd']
>>> re.findall("a[bc]d","aaaacd")
['acd']
>>> re.findall("a[bc]d","aaaabcd")
[]

\  :
后面跟元字符去除特殊功能,
后面跟普通字符实现特殊功能。
引用序号对应的字组所匹配的字符串 (一个括号为一个组)
#\2 就相当于eric 第二个组

>>> re.search(r"(alex)(eric)com\2","alexericcomeric").group()
'alexericcomeric'
>>> re.search(r"(alex)(eric)com\1","alexericcomalex").group()
'alexericcomalex'
>>> re.search(r"(alex)(eric)com\1\2","alexericcomalexeric").group()
'alexericcomalexeric'

\d  :匹配任何十进制数;它相当于类[0-9]

>>> re.findall("\d","aaazz1111344444c")
['', '', '', '', '', '', '', '', '', '']
>>> re.findall("\d\d","aaazz1111344444c")
['', '', '', '', '']
>>> re.findall("\d0","aaazz1111344444c")
[]
>>> re.findall("\d3","aaazz1111344444c")
['']
>>> re.findall("\d4","aaazz1111344444c")
['', '', '']

\D  :匹配任何非数字字符;它相当于类[^0-9]

>>> re.findall("\D","aaazz1111344444c")
['a', 'a', 'a', 'z', 'z', 'c']
>>> re.findall("\D\D","aaazz1111344444c")
['aa', 'az']
>>> re.findall("\D\d\D","aaazz1111344444c")
[]
>>> re.findall("\D\d\D","aaazz1z111344444c")
['z1z']

\s  :匹配任何空白字符;它相当于类[ \t\n\r\f\v]

>>> re.findall("\s","aazz1 z11..34c")
[' ']

\S  :匹配任何非空白字符;它相当于类[^ \t\n\r\f\v]

\w  :匹配任何字母数字字符;他相当于类[a-zA-Z0-9_]

>>> re.findall("\w","aazz1z11..34c")
['a', 'a', 'z', 'z', '', 'z', '', '', '', '', 'c']

\W  :匹配任何非字母数字字符;它相当于类[^a-zA-Z0-9_]

\b  :匹配一个单词边界,也就是指单词和空格间的位置

>>> re.findall(r"\babc\b","abc sdsadasabcasdsadasdabcasdsa")
['abc']
>>> re.findall(r"\balex\b","abc alex abcasdsadasdabcasdsa")
['alex']
>>>
>>> re.findall("\\balex\\b","abc alex abcasdsadasdabcasdsa")
['alex']
>>> re.findall("\balex\b","abc alex abcasdsadasdabcasdsa")
[]

()  :把括号内字符作为一个整体去处理

>>> re.search(r"a(\d+)","a222bz1144c").group()
'a222'
>>> re.findall("(ab)*","aabz1144c")
['', 'ab', '', '', '', '', '', '', ''] #???
>>> re.search(r"a(\d+)","a222bz1144c").group()
'a222'
>>> re.search(r"a(\d+?)","a222bz1144c").group() +的最小次数为1
'a2'
>>> re.search(r"a(\d*?)","a222bz1144c").group() *的最小次数为0
'a'

#非贪婪匹配模式 加? ,但是如果后面还有匹配字符,就无法实现非贪婪匹配
#(如果前后均有匹配条件,则无法实现非贪婪模式

>>> re.findall(r"a(\d+?)b","aa2017666bz1144c")
['']
>>> re.search(r"a(\d*?)b","a222bz1144c").group()
'a222b'
>>> re.search(r"a(\d+?)b","a277722bz1144c").group()
'a277722b'

元字符在字符集里就代表字符,没有特殊意义(有几个例外)

>>> re.findall("a[.]d","aaaacd")
[]
>>> re.findall("a[.]d","aaaa.d")
['a.d']

例外
[-] [^] [\]

[-]
#匹配单个字符,a到z所有的字符

>>> re.findall("[a-z]","aaaa.d")
['a', 'a', 'a', 'a', 'd']
>>> re.findall("[a-z]","aaazzzzzaaccc")
['a', 'a', 'a', 'z', 'z', 'z', 'z', 'z', 'a', 'a', 'c', 'c', 'c']
>>>
>>> re.findall("[1-3]","aaazz1111344444c")
['', '', '', '', '']

[^]
#匹配除了这个范围里的字符,(^在这里有 非 的意思)

>>> re.findall("[^1-3]","aaazz1111344444c")
['a', 'a', 'a', 'z', 'z', '', '', '', '', '', 'c']
>>> re.findall("[^1-4]","aaazz1111344444c")
['a', 'a', 'a', 'z', 'z', 'c']

[\]

>>> re.findall("[\d]","aazz1144c")
['', '', '', '']

flags 编译标志位
re.I 使匹配对大小写不敏感

>>> re.search("com","COM").group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
>>> re.search("com","COM",re.I).group()
'COM'

re.L 做本地化识别(locale-aware)匹配

re.M 多行匹配,影响^和$

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

>>> re.findall(".","abc\nde")
['a', 'b', 'c', 'd', 'e']
>>> re.findall(".","abc\nde",re.S)
['a', 'b', 'c', '\n', 'd', 'e']

re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B

re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
match: re.match(pattern,string,flags=0)

flags 编译标志位,用于修改正则表达式的匹配方式,如:是否区别大小写

re.match("com","comwww.runcomoob").group()
re.match("com","Comwww.runComoob",re.I).group() search:re.search(pattern,string,flags=0)
re.search("\dcom","www.4comrunoob.5com").group()

re.match与re.search的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;

而re.search匹配整个字符串,直到找到一个匹配。

match和search一旦匹配成功,就是一个match object对象,而match object对象有以下方法:

  group() 返回被RE匹配的字符串
  start() 返回匹配开始的位置
  end() 返回匹配结束的位置
  span() 返回一个元组包含匹配(开始,结束)的位置
  group() 返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串,获取匹配到的所有结果(无论是否有组)
  a. group ()返回re整体匹配的字符串,
  b. group (n,m) 返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常
  c. groups ()groups() 方法返回一个包含正则表达式中所有小组字符串的元组,从 1 到所含的小组号,通常groups()不需要参数,返回一个元组,元组中的元就是正则表达式中定义的组。

a = "123abc456"
re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0) #123abc456,返回整体
re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1) #
re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2) #abc
re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3) #

sub subn:
re.sub(pattern, repl, string, max=0)

>>> re.sub("g.t","have","I get A, I got B, I gut C")#匹配g.t字符,用have替换(.匹配一个除了换行符任意一个字符)
'I have A, I have B, I have C'
>>> re.sub("got","have","I get A, I got B, I gut C")
'I get A, I have B, I gut C'
>>> re.sub("g.t","have","I get A, I got B, I gut C",2)#替换两个
'I have A, I have B, I gut C'
>>> re.sub("g.t","have","I get A, I got B, I gut C",1)
'I have A, I got B, I gut C'
>>> re.subn("g.t","have","I get A, I got B, I gut C")#使用re.subn显示替换里多少个
('I have A, I have B, I have C', 3)

re.compile(strPattern[, flag]):
这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。 第二个参数flag是
匹配模式,取值可以使用按位或运算符‘|‘表示同时生效,比如re.I | re.M可以把正则表达式编译成一个正
则表达式对象。可以把那些经常使用的正则表达式编译成正则表达式对象,这样可以提高一定的效率。下面是
一个正则表达式对象的一个例子:

>>> text = "JGood is a handsome boy, he is cool, clever, and so on..."
>>> regex = re.compile(r"\w*oo\w*")
>>> print regex.findall(text)
['JGood', 'cool']

split:

p = re.compile(r"\d+") #+:匹配前面那个字符1到多次
p.split("one1two2three3four4") #spilt分割 >>> p = re.compile(r"\d+")
>>> p.split("one1two2three3four4")
['one', 'two', 'three', 'four', ''] re.split("\d+","one1two2three3four4") >>> re.split("\d+","one1two2three3four4")
['one', 'two', 'three', 'four', ''] >>> re.split("\d+","4one1two2three3four4")
['', 'one', 'two', 'three', 'four', '']#如果分割时左边或者右边已经被分过
>>> re.split("[bc]","abcd")#或者是无字符的情况下,就分出一个空字符
['a', '', 'd']

finditer():

>>> p = re.compile(r"\d+")
>>> iterator = p.finditer("12 drumm44ers drumming, 11 ... 10 ...")
>>>
>>> iterator
<callable-iterator object at 0x02626990>
>>> for match in iterator:
... match.group() , match.span()#每个数字以及它们出现的位置
...

('12', (0, 2))
('44', (8, 10))
('11', (24, 26))
('10', (31, 33))

re.findall("\","abc\com")

#要想匹配出\,因为\本来就有特殊意义,所以需要转意一下,\\,而只转一下仅仅是在python下转意了 ,在正则表达式下
并没有转,所以在python下先转两个 \\\,然后到正则表达式下在输入一个\就是转一个\所以最后需要写四个

>>> re.findall("\\\\","abc\com")
['\\']  #匹配到两个,有一个是转意字符

如果不想要这么麻烦就需要调用原生字符串rawstring,使用时在前面加一个r

>>> re.findall(r"\\","abc\com")
['\\']

由于我们是在python下使用的正则表达式,所以特殊字符需要多次转意,而使用了rawstring之后,就不用在多次转意
仅仅就使用正则的规则就可以

>>> re.findall(r"\d","www4dd6")
['', '']
>>> re.findall("\\d","www4dd6")
['', '']
>>> re.findall("\d","www4dd6")
['', '']

#在这里\d成功的原因是因为\d在ascii码中没有特殊含义,所以在这里就自动转意了,不过正规的写法就是前两个

>>> re.findall(r"\babc","abcsd abc")
['abc', 'abc']
>>> re.findall(r"abc\b","abcsd abc")
['abc']
>>> re.findall(r"abc\b","abcsd abc*")
['abc']
>>> re.findall(r"\babc","*abcsd*abc")
['abc', 'abc']

#检测单词边界不一定就是空格,还可以是除了字母以外的特殊字符

>>> re.findall("www.(baidu|laonanhai).com","mdzz www.baidu.com")
['baidu']

#findall会优先显示组里的内容(优先捕获)

>>> re.findall("www.(?:baidu|laonanhai).com","mdzz www.baidu.com")
['www.baidu.com']

#在组里(括号里)加 ?: 就可以取消优先捕获

python正则表达式+正则大量实例的更多相关文章

  1. python正则表达式应用优化实例

    1.问题出现 需要提取一份xml文件中参数名和参数值,格式如下: <p name="actOlLaPdcch">true</p> 我们需要的字段如上,红色部 ...

  2. Python 字符串正则处理实例

    #coding:utf-8 ''' Created on 2017��9��6�� @author: li.liu ''' from selenium import webdriver from se ...

  3. Python正则简单实例分析

    Python正则简单实例分析 本文实例讲述了Python正则简单用法.分享给大家供大家参考,具体如下: 悄悄打入公司内部UED的一个Python爱好者小众群,前两天一位牛人发了条消息: 小的测试题:  ...

  4. Python正则表达式如何进行字符串替换实例

    Python正则表达式如何进行字符串替换实例 Python正则表达式在使用中会经常应用到字符串替换的代码.有很多人都不知道如何解决这个问题,下面的代码就告诉你其实这个问题无比的简单,希望你有所收获. ...

  5. 第11.25节 Python正则表达式编译re.compile及正则对象使用

    一. 引言 在<第11.2节 Python 正则表达式支持函数概览>介绍了re模块的主要函数,在<第11.3节 Python正则表达式搜索支持函数search.match.fullm ...

  6. Python正则表达式学习摘要及资料

    摘要 在正则表达式中,如果直接给出字符,就是精确匹配. {m,n}? 对于前一个字符重复 m 到 n 次,并且取尽可能少的情况 在字符串'aaaaaa'中,a{2,4} 会匹配 4 个 a,但 a{2 ...

  7. Python 正则表达式-OK

    Python正则表达式入门 一. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分. 正则表达式是用于处理字符串的强大工具, 拥有自己独特的语法以及一个独立的处理引擎, 效率上 ...

  8. python正则表达式基础,以及pattern.match(),re.match(),pattern.search(),re.search()方法的使用和区别

    正则表达式(regular expression)是一个特殊的字符序列,描述了一种字符串匹配的模式,可以用来检查一个字符串是否含有某种子字符串. 将匹配的子字符串替换或者从某个字符串中取出符合某个条件 ...

  9. python大法好——Python 正则表达式

    Python 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. r ...

随机推荐

  1. 模拟ArrayList

    package com.helloidea; import java.util.ArrayList; import java.util.Collection; import java.util.Lis ...

  2. TP5.0:引入view视图中公共的模版文件

    1.实例:如后台admin模块,公用一个header.html和footer.hml 2.目录结构: 3.视图页面的使用方式: <!--添加header页面数据-->{include fi ...

  3. 长大DeepMind第一次团队作业

    1.队名 长大DeepMind 2.队员风采 学号 姓名 擅长的技术 编程的兴趣点 希望承担的角色 一句话宣言 B20150304508 晏司举 JAVA,ssm框架,MySQL数据库 JAVA后台服 ...

  4. 如何使用代码获得一个function module的Where Used List

    如果要获得一个function module的Where Used List,我们通常用的办法是使用ABAP workbench里提供的功能. where used list显示结果如下: 但我接到一 ...

  5. netbackup 8.1安装前注意事项

    一.NetBackup 主服务器的 Web 服务器用户/组设置步骤 文章 ID:100034818 上次发布时间:2017-08-24 产品:NetBackup   问题 从 NetBackup 8. ...

  6. [USACO17FEB]Why Did the Cow Cross the Road II P

    嘟嘟嘟 考虑dp. 对于ai,和他能匹配的bj只有9个,所以我们考虑从这9个状态转移. 对于ai 能匹配的一个bj,当前最大的匹配数一定是[1, j - 1]中的最大匹配数 + 1.然后用树状数组维护 ...

  7. redis未授权访问getshell

    redis未授权访问的问题一年前就爆了,当时刚开始学安全,还不太懂.今天借着工作的机会来搞一把,看看能不能拿下一台服务器.其实前几天就写好了一直想找个实际环境复现一下,一直没有找到,只说下大致思路. ...

  8. 【转】一个Android项目搞定所有主流架构-1.项目介绍和基本MVC架构示例

    http://www.jianshu.com/p/798536fb91c5 项目启发来自谷歌的同类框架项目https://github.com/googlesamples/android-archit ...

  9. html下载文件和上传文件(图片)(java后台(HttpServlet))打开保存路径和选择文件录取+(乱码UTF-8)+包

    下载文件: //通过路径得到一个输入流 String path = "获取需要下载的文件路径"; //path.lastIndexOf(".")+1可以获取文件 ...

  10. lucene&solr学习——solr学习(二) Solr管理索引库

    1.什么是solrJ solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,如下图: 依赖jar包: 2 ...