现在的位置: 首页 > 综合 > 正文

Python re模块正则表达式

2016年04月17日 ⁄ 综合 ⁄ 共 2266字 ⁄ 字号 评论关闭

1.什么是正则表达式

  正则表达式是可以匹配文本片段的模式。最简单的正则表达式就是普通的字符串,可以匹配其自身。也就是正则表达式'python'可以匹配字符串'python'。你可以用这种匹配行为搜索文本中的模式,并且用计算后的值替换特定模式,或者将文本进行分段。

通配符

正则表达式可以匹配多于一个的字符串,你可以使用一些特殊字符创建这类模式。比如点号(.)可以匹配任何字符(除了换行符),所以正则表达式'.ython'可以匹配字符串'python'和'jython'等,但是不会匹配'cpython'或者'ython'这样的字符串,因为点号只能匹配一个字母而不是两个或零个。

因为它可以匹配“任何字符串”,点号就称为通配符

对特殊字符进行转义

在正则表达式中如果将特殊字符作为普通字符使用会遇到问题,如需要匹配字符串'python.org',直接用'python.org'也会匹配'pythonzorg',这可不是期望的结果。为了让特殊字符表现得像普通字符一样,需要对它进行转义--可以在它前面加上反斜线。本例可以使用'python\\.org',这样就只会匹配'python.org'了。

字符集

匹配任意字符串可能很有用,但有些时候你需要更多的控制权。你可以使用中括号扩住字符串来创建字符集。字符集可以匹配它所包括的任意字符,所以[pj]ython能够匹配字符串'python'和'jython',而非其他内容。你可以使用范围,比如'[a-Z]'能够(按字母顺序)匹配a到z的任意一个字符,还可以通过一个接一个的方式将范围联合起来使用,比如'[a-z-A-Z0-9]'能匹配任意大小写字母和数字。

为了反转字符集,可以在开头使用^字符,比如‘[^abc]’可以匹配任何除了a、b和c之外的字符。

选择符和子模式

在字符串的每个字符都各不相同的情况下,字符集是很好用的,但如果只想匹配字符串'python'和'perl'呢?你就不能使用字符集或者通配符来指定某个特定的模式了,取而代之的是用于选择的特殊字符:管道符号(|)。因此、所需的模式可以写成'python|per'

有时候不需要对整个模式使用选择运算符,只是模块的一部分。这时可以使用圆括号括起需要的部分,或称子模式。前例可以写成'p(ython|erl)'

可选项和重复子模块

在子模块后面加上问号,它就变成了可选项。它可能出现在匹配字符串中,但并非必须的。如:

r'(http://)?(www\.)?python\.org'

只能匹配下列字符串

'http://www.python.org'

'http://python.org'

www.python.org'

'python.org'

下面运算符允许子模式重复多次:

(pattern)*:允许模式重复0次或多次;

(pattern)+:允许模式重复1次或多次;

(pattern){m,n}:允许模式重复m~n次。

字符串的开始和结尾

字符串'www.python.org'中的子字符串'www'能够匹配模式'w+'、在寻找这样的字符串时,确定子字符串位于整个字符串的开始还是结尾是很有用的。只想字符串在开头而不是其他位置匹配'ht+p',那么可以使用脱字符(^)标记开始:'^ht+p'会匹配'http://python.org'但是不匹配'www.http.org'。类似的,字符串结尾用美元符号($)标示。

2.re模块的内容

函数 描述
compile(pattern[,flags]) 根据包含正则表达式的字符串创建模式对象
search(pattern,string[,flags]) 在字符串中寻找模式
match(pattern,string[,flags]) 在字符串开始处匹配模式
split(pattern,string[,maxsplit=0]) 根据模式的匹配项来分割字符串
findall(pattern,string) 列出字符串中模式的所有匹配项
sub(pat,repl,string[,count=0]) 将字符串中所有pat的匹配项用repl替换
escape(string) 将字符串中所有特殊正则表达式字符转义

函数re.compile将正则表达式转换为模式对象,可以实现更有效率的匹配。正在调用search或者match函数的时候使用字符串表示的正则表达式,它们也会在内部将字符串转换为正则表达式对象。使用compile完成一次转换后,在每次使用模式的时候就不用进行转换。

函数re.search会在给定字符串中寻找第一个匹配给定正则表达式的子字符串。一但找到子字符串,函数就会返回MathObject(值为True),否则返回None(值为False)。

函数re.match会在给定字符串的开头匹配正则表达式。因此,match('p','python')返回真,而re.match('p','www.python.org')则返回假

函数re.split会根据模式的匹配项来分割字符串。

>>>some_text='alpha,beat...,gamma delta'
>>>re.split('[.]',some_text)
['alpha','beat','gamma','delta']

函数re.findall以列表形式返回给定模式的所有匹配项

>>>pat='[a-zA-Z]+'
>>>text='"Hm.. Err -- are you sure"''
>>>re.findall(pat,text)
['Hm','Err','are','you','sure']

抱歉!评论已关闭.