3.2.1 正则表达式的语法
特别字符集: ‘.’ 点号,在缺省的情况下,可以用来代替任何除换行符之外的字符;如果DOTALL标志设置了,它可以用来代替任何字符,包括换行符。 例子: #re importre m=re.findall('a.','aba2bba+') ifm: print(m) 结果输出如下: ['ab','a2','a+'] 在这个例子里,先使用import语句导入正则表达式库re,然后使用函数findall来查找所有与正则表达式’a.’匹配的字符串,生成一个列表保存在m里,最后判断是否找到,如果找到了就打印出来。在这个正则表达式里’a.’,由字母a和点号组成,意思就是匹配以a开头的任意字符的两个字符的字符串。这里的任意字符是不包括换行符。 ‘^’ 插入符用来表示只匹配字符串开始的字符串,或者设置多行标志MUTILINE时,每一行新行开始也可以匹配。不使用这个字符就表示在任何位置上都匹配字符串。 例子: #re importre m=re.findall('a.','aba2bba+') ifm: print(m) m=re.findall('a..','aba2bba+') ifm: print(m) m=re.findall('^a.','a+'] ['ab','a2'] ['ab'] 在这个例子里,可以看到最后一行的输出,就只匹配了第一个字符串。 ‘$’ 美元符号用来表示匹配字符串末尾,或者匹配在新行前面的字符串末尾。比如用foo$来匹配字符串foo、foobar时,只会有foo可以匹配成功,而foobar不会,因为foo不是在词尾里。又例如当正则表达式为foo.$时,从字符串’foo1nfoo2n’时,当MULTILINE不起作用时,只会匹配到foo2;当多行起作用时,也会匹配到foo1。当只有一个$字符时,去搜索一个字符串’foon’,可以匹配到两个空的字符串出来,一个是在这个字符串新行之前,一个在这个字符串之后。 例子: print('$') m=re.findall('a.$','aba2bba+') ifm: print(m) m=re.findall('$a.','aba2bba+') ifm: print(m) m=re.findall(r'foo$',r'foobarn') ifm: print(m) print(r'foobarntestfoo') m=re.findall(r'foo$',r'foobarntestfoo') ifm: print(m) m=re.findall(r'foo.$',r'foo1nfoo2') ifm: print(m) m=re.findall(r'$',r'foon') ifm: print(m) 结果输出如下: $ ['a+'] foobarntestfoo ['foo'] ['foo2'] [''] ‘*’ 星号的作用是在星号之前的字符可以0个到无限个重复。比如ab*将会匹配a、ab,或者a后面不限定个b的字符串,比如abbbbbbb等。 例子: print('*') m=re.findall(r'ab*',r'aababcabbbabbbb2abbbbbbbb') ifm: print(m) 结果输出如下: * ['a','ab','abbb','abbbb','abbbbbbbb'] ‘+’ 加号的作用是在加号之前的字符可以1个到无限个重复。比如ab+表示是a后可以有一个到无限个b的字符串会匹配成功。即是ab、abb,或者无限个b,匹配a不会成功,这是与星号的区别之处。 例子: print('+') m=re.findall(r'ab+',r'aababcabbbabbbb2abbbbbbbb') ifm: print(m) 结果输出如下: + ['ab','abbbbbbbb'] ‘?’ 问号的作用是在问号之前的字符可以不出现或者只出现一次。比如ab?表示只匹配a或者ab。 例子: print('?') m=re.findall(r'ab?',r'aababcabbbabbbb2abbbbbbbb') ifm: print(m) 结果输出如下: ? ['a','ab'] *?,+?,?? 星号、加号和问号都是贪婪算法,尽可能匹配更多的字符。但它们组合之后会有点不一样。具体如例子: print('*?') m=re.findall(r'ab*?',r'aababcabbbabbbb2abbbbbbbb') ifm: print(m) print('+?') m=re.findall(r'ab+?',r'aababcabbbabbbb2abbbbbbbb') ifm: print(m) print('??') m=re.findall(r'ab??',r'aababcabbbabbbb2abbbbbbbb') ifm: print(m) 结果输出如下: *? ['a','a','a'] +? ['ab','ab'] ?? ['a','a'] {m} 大括号中间添加数字方式来匹配括号之前字符的个数。比如a{6}表示匹配6个相同的a,如果少于6个a不会匹配成功,但允许多于6个。 例子: print('a{6}') m=re.findall(r'a{6}',r'baaaaaadaabaaaaaaaaa') ifm: print(m) 结果输出如下: a{6} ['aaaaaa'] {m,n} 大括号和m,n组成一个上下限的重复字符。m表示重复的下限个数,可以到0个;n表示重复的上限个数,可以到无穷大;尽可能向多的个数匹配。比如a{2,3}b表示查找2到3个连续的a,并且后面紧跟着b的字符串。比如a{2,}b表示查找2个以上的a,并且后面跟着b的字符串。 例子: print('a{2,3}b') m=re.findall(r'a{2,3}b',r'aabbaaababaaaaaaaaab') ifm: print(m) print('a{2,}b') m=re.findall(r'a{2,}b',r'aabbaaababaaaaaaaaab') ifm: print(m) print('a{0,3}b') m=re.findall(r'a{0,r'aabbaaababaaaaaaaaab') ifm: print(m) 结果输出如下: a{2,3}b ['aab','aaab','aaab'] a{2,}b ['aab','aaaaaab'] a{0,'b','aaab'] {m,n}? 大括号和m,n组成一个上下限的重复字符。m表示重复的下限个数,可以到0个;n表示重复的上限个数,可以到无穷大;尽可能向少的个数匹配。比如a{2,3}?b表示查找2到3个连续的a,并且后面紧跟着b的字符串。比如字符串aaaaaa,a{3,5}将尽可能匹配5个a,而a{3,5}?只会匹配3个a就返回了。 例子: print('a{2,3}') m=re.findall(r'a{2,3}',r'aaabaaaaaaa') ifm: print(m) print('a{2,3}?') m=re.findall(r'a{2,3}?',r'aaabaaaaaaa') ifm: print(m) 结果输出如下: a{2,3} ['aa','aaa','aaa'] a{2,3}? ['aa','aa','aa'] ‘’ 反斜线表示后面跟着的字符表示为原来的字符。比如*表示星号字符。 例子: print('a**') m=re.findall(r'a**',r'a*abaaa*abbbb') ifm: print(m) 结果输出如下: a** ['a*','aaa*'] [] 方括号用来指明一个字符集合。 l列出可能出现的字符集合。比如[amk]表示可能匹配a、m、k三个字符。 l通过范围来指定出现字符的集合,范围的格式是两个字符和‘-’组成。比如[a-z]表示小写字母集合,包括了从a到z的所有字母。比如[0-5][0-9]表示两位数字00到59的集合。比如[0-9A-Fa-f]是表示十六进制所有出现的字符集合。如果‘-’出现在反斜线后面表示只使用‘-’字符,比如[a-z];或者‘-’出现在集合的最前面或最后面都是表示使用‘-’字符,比如[a-]。 l所有特别意义的字符在方括号内会失去表示特别的意义,仅当作本身字符使用。比如[(+*)]表示匹配(,+,*,)这四个字符,没有表示任意字符的意思。 l分类字符意义的字符可以使用,比如w或者s,这些字符定义意义在后面。 l非出现字符的集合表达。在中括号之后添加字符^表示排除这个集合里的字符,比如[^5]表示除5之外字符都匹配。[^^]是表示除^字符之外的所有字符都匹配。如果字符^不放在第一个字符是没有特别意义的。 l为了匹配后中括号],需要使用转义字符或者把它放在第一个字符位置。比如[()[]{}]或者[]()[{}],要注意就是后一个是把]放在最前面第一个字符。 例子: print('[amk]') m=re.findall(r'[amk]',r'eadmkbc') ifm: print(m) print('[a-z]') m=re.findall(r'[a-z]',r'13eadmkbc89') ifm: print(m) print('[0-5][0-9]') m=re.findall(r'[0-5][0-9]',r'01a1994938') ifm: print(m) 输出结果如下: [amk] ['a','m','k'] [a-z] ['e','d','k','c'] [0-5][0-9] ['01','49','38'] ‘|’ A|B,A或B的正则表达式,表达的意思只要A表达式成立或者B表达式成立,都可以匹配成功。如果A表达全部匹配完成,将再不考虑B表达式。如果要匹配|,可以使用|形式,或者[|]形式来编写。 例子: print('[2-4]|[7-9]') m=re.findall(r'[2-4]|[7-9]',r'123456789') ifm: print(m) 输出结果如下: [2-4]|[7-9] ['2','3','4','7','8','9'] (...) 根据括号中任意的正则表达式来进行匹配,匹配成功之后作为元组输出。像括号三个点号,表示匹配任意三个字符作为一个元组;如果有四个点号,表示匹配四个任意字符作为一个元组。如果想匹配括号使用反斜线,或者中括号[(]或[)]方式。 例子: print('(...)') m=re.findall(r'(...)',r'12345678abcdefghijk') ifm: print(m) 输出结果如下: (...) ['123','45','678','cde','fgh','ijk'] 蔡军生 QQ:9073204 深圳 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |