正则表达式

来源:互联网 发布:spss案例数据免费下载 编辑:程序博客网 时间:2024/06/03 06:49

在python中内嵌re模块.

普通字符:如‘test'’,abc这类的

元字符(通配字符):‘.’,‘*’,‘$’,'[]' '{}' ,'\',‘+’,‘?‘,’’ '^'等等

str=r"abc"

导入re模块

re.findall(str,'abbc')#在“abbc”中寻找str这个字符串,其中str表示一个查找规则或者说是模板也行。不过这个模板str=r'abc’这样定义才行。这个方法会返回查找到的结果


[ ],通常用来指定一个范围例如[a-z],[0-9],匹配其中某一个字符,但是一般里面若有元字符,则会表示普通字符例如[abc$],[ab^c],但不过里面有个特殊的表示,就是[^abc].这表示除了abc这三个字符,[^0-9]除了0-9数字外的任意字符。大小写加数字[0-9a-zA-Z]


' | '或,'&’且

^开头  str=r’^hello'开头是否含有hello

$表示末尾 str=r'$hello' 行尾是否含有hello

'\'脱义字符  例如 str=r'\^root'  匹配字符"^root"

反斜杠加某些字符的特殊含义,单次匹配

\d 匹配任何十进制数字相当于[0-9]

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

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

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

\w匹配任何字母数字相当于[0-9a-zA-Z]

\W匹配任何非字母数字相当于[^0-9a-zA-Z]

重复匹配元字符

*匹配前面字符0次或者多次

{}表示匹配前面字符重复的次数,例如 a{8},表示需要匹配前面8个a 

+前面字符至少出现1次

?将前面的字符重复0次或者1次。也就是用于那种可有可无的符号的场景

{1,3}将前面字符至少重复1-3次 例如 a{1,3}b表示a可重复1-3次

"()"分组

用re.findall()会优先返回分组里面的匹配项

>>> s=r'\w{4}\.(com|cn)'

>>> re.findall(s,"1234.com")
['com']




上面所写的str=r’[0-9]ab.*'  正则表达格式是解释型的。

下面是对象编译型的,就是把str这种格式编译成一种对象。

其中要用到re模块

import  re

    p=re.complie(r’[0-9]ab.*') 这就把正则表达格式转变成了对象p

re.compile(x,y),x为正则格式,y为其它的参数  例如当y为re.I 表示忽略大小写

re.findall(x,y)也可以用这种属性

y参数除了I以外还有其他的参数

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

>>> s=r'net.net'
>>> re.findall(s,"netonet")
['netonet']
>>> re.findall(s,"net\nnet")
[]

>>> re.findall(s,"net\nnet",re.S)
['net\nnet']


L


M多行匹配,影响^和$

>>> s="""
... hello dai
... hello zi
... daixiangzi ok
... """
>>> s
'\nhello dai\nhello zi\ndaixiangzi ok\n'
>>> re.findall(r'^hello',s)
[]
>>> re.findall(r'^hello',s,re.M)
['hello', 'hello']


X能够使用REs和verbosre状态。

>>> s="""
... \d{3,4}
... -?
... \d{8}
... """
>>> re.findall(s,'010-12345678')
[]


>>> re.findall(s,'010-12345678',re.X)
['010-12345678']










re.complie(r’abc',re.I

这样做的结果会使得匹配速度快很多。

re对象中有几种常用的方法/属性

match():决定RE是否在字符串刚开始的位置匹配。调用形式:p.match(str)

search():扫描字符串,找到这个RE匹配的位置。调用形式p.search(str)

上面两个如果没有匹配到就会返回None,查找成功就会返回一个对象

findall()找到所有和RE匹配的子串,并作为一个列表返回

finditer()找到RE所有匹配的 子串,并把他们作为一个迭代器返回

如果要看matchObject对象里面的内容,就需要用group这个方法

例如x=p.match(str)

         x.group()

>>> p.search("adc abc")
<_sre.SRE_Match object at 0xb76a8f70>
>>> x=p.search("adc abc")
>>> x.group()
'abc'

还有end()返回结束位置

    start()返回开始位置

     span()返回一个元组包含匹配(开始,结束)的位置

>>> import re
>>> p=re.compile(r'abc')
>>> x=p.match("abc der")
>>> x.group()
'abc'
>>> x.end()
3
>>> x.start()
0
>>> x.span()
(0, 3)


re.sub(re,替换字符,被替字符,【替换次数,省略的时候默认全部替换】) 返回的替换后的字符串

和str.replace(被替换字符,替换字符)不同的是,sub是符号re正则的才会被替换

re.split(re,str)根据re正则表达式对str进行分割

>>> str="123+232-212*454"
>>> r=r'[\+\-\*]'
>>> re.split(r,str)
['123', '232', '212', '454']

若想看re模块里面所有的方法用dir(re)就可以 查看方法使用信息用help(方法)


”()”分组用法小例子

>>> print s


dad hello src=da 11323 43
hello src=dfds dsf
src=dasd 243 fds


>>> r1=r'hello src=.+'
>>> re.findall(r1,s)
['hello src=da 11323 43', 'hello src=dfds dsf']
>>> r1=r'hello src=(.+)'
>>> re.findall(r1,s)
['da 11323 43', 'dfds dsf']















0 0