python的正则表达式

来源:互联网 发布:金林钣金放样软件 编辑:程序博客网 时间:2024/05/22 07:52

http://www.cnblogs.com/chuxiuhong/p/5885073.html
http://blog.csdn.net/blockcsh/article/details/72510319

#    +  表示一个或多个 的作用是将前面一个字符或一个子表达式重复一遍或者多遍。#    ?  表示一个或0个#    *  表示0个或1个  跟在其他符号后面表达可以匹配到它0次或多次#    []  代表匹配里面的字符中的任意一个#   . 除换行之外的任何字符 \n#   \转义字符,间接。  \r  \n#   \d是数字#   \D是非数字的其他字符#   \s是空白字符。 空格 \t \r \n \f \v#   \S是非空白字符。#   \w是单词字母字符#   \W是非单词字符import rekey = r"afiouwehrfuichuxiuhong@hit.edu.cnaskdjhfiosuehafiouwehrfuichuxiuhong@hit.edu.cn"p1 = r"chuxiuhong@hit\.edu\.cn" #自定义的正则表达式pattern1 = re.compile(p1)        #先编译print (pattern1.findall(key))    #这是返回一个数组['chuxiuhong@hit.edu.cn', 'chuxiuhong@hit.edu.cn']
import rekey = r"http://www.nsfbuhwe.com and https://www.auhfisna.com"#胡编乱造的网址,别在意p1 = r"https*://"#看那个星号!pattern1 = re.compile(p1)print (pattern1.findall(key))['http://', 'https://']

2.比方说我们有这么一个字符串”cat hat mat qat”,你会发现前面三个是实际的单词,最后那个是我胡编乱造的(上百度查完是昆士兰英语学院的缩写= =)。如果你本来就知道”at”前面是c、h、m其中之一时这才构成单词,你想把这样的匹配出来。根据已经学到的知识是不是会想到写出来三个正则表达式进行匹配?实际上不需要。因为有一种多字符匹方式
[]代表匹配里面的字符中的任意一个
还是举个栗子,我们发现啊,有的程序员比较过分,,在这对标签上,大小写混用,老害得我们抓不到想要的东西,我们该怎么应对?是写16*16种正则表达式挨个匹配?no

import rekey = r"lalala<hTml>hello</Html>heiheihei"p1 = r"<[Hh][Tt][Mm][Ll]>.+</[Hh][Tt][Mm][Ll]>"pattern1 = re.compile(p1)print (pattern1.findall(key))['<hTml>hello</Html>']

我们既然有了范围性的匹配,自然有范围性的排除。
[^]代表除了内部包含的字符以外都能匹配
还是cat,hat,mat,qat这个例子,我们想匹配除了qat以外的,那么就应该这么写:

import rekey = r"mat cat hat pat"p1 = r"[^p]at"#这代表除了p以外都匹配pattern1 = re.compile(p1)print pattern1.findall(key)['mat', 'cat', 'hat']

介绍到这里,我们可能已经掌握了大致的正则表达式的构造方式,但是我们常常会在实战中遇到一些匹配的不准确的问题。比方说:

import rekey = r"chuxiuhong@hit.edu.cn"p1 = r"@.+\."#我想匹配到@后面一直到“.”之间的,在这里是hitpattern1 = re.compile(p1)print pattern1.findall(key)['@hit.edu.']

呦呵!你咋能多了呢?我理想的结果是@hit.,你咋还给我加量了呢?这是因为正则表达式默认是“贪婪”的,我们之前讲过,“+”代表是字符重复一次或多次。但是我们没有细说这个多次到底是多少次。所以它会尽可能“贪婪”地多给我们匹配字符,在这个例子里也就是匹配到最后一个“.”。
我们怎么解决这种问题呢?只要在“+”后面加一个“?”就好了。

import rekey = r"chuxiuhong@hit.edu.cn"p1 = r"@.+?\."#我想匹配到@后面一直到“.”之间的,在这里是hitpattern1 = re.compile(p1)print pattern1.findall(key)['@hit.']

加了一个“?”我们就将贪婪的“+”改成了懒惰的“+”。这对于[abc]+,\w*之类的同样适用。
个人建议:在你使用”+”,”*”的时候,一定先想好到底是用贪婪型还是懒惰型,尤其是当你用到范围较大的项目上时,因为很有可能它就多匹配字符回来给你!!!

为了能够准确的控制重复次数,正则表达式还提供
{a,b}(代表a<=匹配次数<=b)

还是举个栗子,我们有sas,saas,saaas,我们想要sas和saas,我们怎么处理呢?

import rekey = r"saas and sas and saaas"p1 = r"sa{1,2}s"pattern1 = re.compile(p1)print pattern1.findall(key)['saas', 'sas']

如果你省略掉{1,2}中的2,那么就代表至少匹配一次,那么就等价于?
如果你省略掉{1,2}中的1,那么就代表至多匹配2次。