正则表达式,和python re模块
http://blog.sina.com.cn/s/blog_a15aa56901017liq.html
python详解re模块(2012-08-06 11:29:01)
转载▼
正则表达式的元字符有. ^ $ * ? { [ ] | ( ) 正则表达式(可以称为REs,regex,regex pattens)是一个小巧的,高度专业化的编程语言,它内嵌于python开发语言中,可通过re模块使用。正则表达式的 pattern可以被编译成一系列的字节码,然后用C编写的引擎执行。下面简单介绍下正则表达式的语法 #验证在元字符[]中,"^"在不同位置所代表的意义。 不过对于元字符”^”有这么一个疑问.官方文档http://docs.python.org/library/re.html有关元字符”^”有这么一句话,Matches the start of the string,and in 我理解的是”^”匹配字符串的开始,在MULTILINE模式下,也匹配换行符之后。 >>> m=re.search("^aw+","abcdfana1b2c3") 'abcdfa' >>> m=re.search("^aw+","abcdfana1b2c3",re.MULTILINE), >>> m.group() 'abcdfa' 我 认为flag设定为re.MULTILINE,根据上面那段话,他也应该匹配换行符之后,所以应该有m.group应该有"a1b2c3",但是结果没 有,用findall来尝试,可以找到结果。所以这里我理解之所以group里面没有,是因为search和match方法是匹配到就返回,而不是去匹配 所有。 >>> m=re.findall("^aw+",re.MULTILINE) >>> m ['abcdfa','a1b2c3'] >>> m=re.search("foo.$","foo1nfoo2n") >>> re.findall("a{5}","aaaaaaaaaa") >>> re.findall("a{2,4}?",'aa'] 元字符“.”在默认模式下,匹配除换行符外的所有字符。在DOTALL模式下,匹配所有字符,包括换行符。 >>> importre >>> re.match(".","n") >>> m=re.match(".","n") >>> print m None >>> m=re.match(".","n",re.DOTALL) >>> print m <_sre.SRE_Match object at 0x00C2CE20> >>> m.group() 'n' 下面我们首先来看一下Match Object对象拥有的方法,下面是常用的几个方法的简单介绍 1.group([group1,…]) >>> m=re.match("(w+) (w+)","abcd efgh,chaj") >>> m.group() 'abcd efgh' >>> m.group(1) 'abcd' >>> m.group(2) 'efgh' >>> m.group(1,2) ('abcd','efgh') >>> m=re.match("(?P<first_name>w+) (?P<last_name>w+)","sam lee") 下面把括号去掉 >>> m=re.match("w+ w+",chaj") >>> m.group() 'abcd efgh' >>> m.group(1) Traceback (most recent call last): IndexError: no such group If a group matches multiple times,only the last match is accessible: >>> m=re.match(r"(..)+","a1b2c3") >>> m.group(1) 'c3' >>> m.group() 'a1b2c3' Group的默认值为0,返回正则表达式pattern匹配到的字符串 >>> s="afkak1aafal12345adadsfa" >>> pattern=r"(d)w+(d{2})w" >>> m=re.match(pattern,s) >>> print m None >>> m=re.search(pattern,s) >>> m <_sre.SRE_Match object at 0x00C2FDA0> >>> m.group() '1aafal12345a' >>> m.group(1) '1' >>> m.group(2) '45' >>> m.group(1,2,0) ('1','45','1aafal12345a') 2。groups([default]) 返回一个包含所有子组的元组。Default是用来设置没有匹配到组的默认值的。Default默认是"None”, >>> m=re.match("(d+).(d+)","23.123") >>> m.groups() ('23','123') >>> m=re.match("(d+).?(d+)?","24") #这里的第二个d没有匹配到,使用默认值"None" >>> m.groups() ('24',None) >>> m.groups("0") ('24','0') 3.groupdict([default]) 返回匹配到的所有命名子组的字典。Key是name值,value是匹配到的值。参数default是没有匹配到的子组的默认值。这里与groups()方法的参数是一样的。默认值为None >>> m=re.match("(w+) (w+)","hello world") >>> m.groupdict() {} >>> m=re.match("(?P<first>w+) (?P<secode>w+)","hello world") >>> m.groupdict() {'secode': 'world','first': 'hello'} 通过上例可以看出,groupdict()对没有name的子组不起作用 正则表达式对象 re.search(string[, 扫描字符串string,查找与正则表达式匹配的位置。如果找到一个匹配就返回一个MatchObject对象(并不会匹配所有的)。如果没有找到那么返回None。 第二个参数表示从字符串的那个位置开始,默认是0 第三个参数endpos限定字符串最远被查找到哪里。默认值就是字符串的长度。. >>> m=re.search("abcd",'1abcd2abcd') >>> re.findall("abcd","1abcd2abcd") re.split(pattern, 用pattern来拆分string。如果pattern有含有括号,那么在pattern中所有的组也会返回。 >>> re.split("W+","words,words,works",1) ['words','words,works'] >>> re.split("[a-z]","0A3b9z",re.IGNORECASE) ['0A3','9',''] >>> re.split("[a-z]+",''] >>> re.split("[a-zA-Z]+","0A3b9z") ['0','3',''] >>> re.split('[a-f]+','0a3B9',re.IGNORECASE)#re.IGNORECASE用来忽略pattern中的大小写。 ['0','3B9'] 如果在split的时候捕获了组,并且匹配字符串的开始,那么返回的结果将会以一个空串开始。 >>> re.split('(W+)','...words,words...') ['','...','words',',''] >>> re.split('(W+)',words...') ['words',''] re.findall(pattern, 以list的形式返回string中所有与pattern匹配的不重叠的字符串。String从左向右扫描,匹配的返回结果也是以这个顺序。 Return all non-overlapping matches of >>> re.findall('(W+)',words...') [','...'] >>> re.findall('(W+)d',words...d') ['...'] >>> re.findall('(W+)d','...dwords,words...d') ['...','...'] re.finditer(pattern, 与findall类似,只不过是返回list,而是返回了一个叠代器 >>> re.sub("d","abc1def2hijk","RE") 'RE' >>> x=re.sub("d","RE") >>> x 'RE' >>> re.sub("d","RE",) 'abcREdefREhijk' >>> re.subn("d",) ('abcREdefREhijk',2) 通过例子我们可以看出sub和subn的差别:sub返回替换后的字符串,而subn返回由替换后的字符串以及替换的个数组成的元组。 re.sub(pattern, >>> def dashrepl(matchobj): ... ... 需要转义的字符有: . * ^ & [ ] { } ? 等 注意的是如果在[]字符集合里,很多字符都不需要转义 建议你看一下这篇基础教程: http://deerchao.net/tutorials/regex/regex-1.htm 是完全通配的意思,s是指空白,包括空格、换行、tab缩进等所有的空白,而S刚好相反 这样一正一反下来,就表示所有的字符,完全的,一字不漏的。 另外,[]这个符号,表示在它里面包含的单个字符不限顺序的出现,比如下面的正则: [ace]* 这表示,只要出现a/c/e这三个任意的字母,都会被匹配 [s]表示,只要出现空白就匹配 [S]表示,非空白就匹配 那么它们的组合,表示所有的都匹配,与它相对应的,有[wW]等,意义完全相同、 另外要说的一点是,为什么有"."这个通配符了,还要这样的用法。 其实,[sS] [wW]这样的用法,比较"."所匹配的还要多,因为"."是不会匹配换行的,所有出现有换行匹配的时候,人们就习惯 使用[sS]或者[wW]这样的完全通配模式。
追问:
那么专家再请问一下,为什么我用s匹配不了换行?只有用[sS]才行? 这几天复习没时间。。。让你久等了,等一下我选最佳的时候加分。。
追答:
s无法匹配换行?这不对呀。 我在PHP、JavaScript、C#这三种语言中都使用过该正则,可以匹配。 而且当你说无法匹配后,我还以为我记错了,都测试了一下,是可以匹配的! 你是不是匹配后输出没有处理? 比如在HTML网页中没有看到,如果是这样,因为HTML网页中是不会显示出rn或者n这样的换行的,要查看也只能在源代码中看到,HTML中只能看到<br />这样的换行。
追问:
好吧,我的是易语言。。我采纳了。。。
追答:
易语言... 易语言的学习好像不比C#之类的好学吧,最多是多了中文函数、中文变量什么的。
w匹配任何单字字符,S匹配任何非Unicode空白的字符,这两个有什么区别啊?
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |