首页 » Linux » python模块之re正则

python模块之re正则

 

re.findall

\w:匹配数字、字母、下划线
\W:匹配非数字、字母、下划线

>>> re.findall('\w','hello jim 123')
['h', 'e', 'l', 'l', 'o', 'j', 'i', 'm', '1', '2', '3']
>>> re.findall('\W','hello jim 123')
[' ', ' ']

\s:匹配任意空白字符,等价于【\t\n\r\f]
\S:匹配任意非空字符

>>> re.findall('\s','hello jim 123')
[' ', ' ']
>>> re.findall('\S','hello jim 123')
['h', 'e', 'l', 'l', 'o', 'j', 'i', 'm', '1', '2', '3']

>>> re.findall('\s','hello jim \n 123 \t') #\n和\t是可以被匹配到的
[' ', ' ', '\n', ' ', ' ', '\t']

\d:匹配任意数字,等价于【0-9】
\D: 匹配任意非数字

>>> re.findall('\d','hello \d23*-_jim 123')
['2', '3', '1', '2', '3']
>>> re.findall('\D','hello \d23*-_jim 123')
['h', 'e', 'l', 'l', 'o', ' ', '\\', 'd', '*', '-', '_', 'j', 'i', 'm', ' ']

\A:匹配字符串开始,等同于^
\Z:匹配字符串结束,等同于$

>>> re.findall('\Ahe','hello jim 123')
['he']
>>> re.findall('\Ahe','aahello jim 123')
[]
>>> re.findall('^he','hello jim 123')
['he']
>>> re.findall('\Z123','aahello jim 123')
[]
>>> re.findall('123\Z','aahello jim 123')
['123']
>>> re.findall('123$','aahello jim 123')
['123']

重复匹配:
.:匹配任意非换行字符。
[…]:用来表示一组字符。
[^…]:不在[]中的字符。
*:匹配0个或多个的表达式。
+:匹配1个或多个的表达式。
?:匹配0个或1个的由产面正则定义的片段,非贪婪方式。
{n}:匹配n个前面的表达式。
{n,m}:匹配n到m次由前面的正则表达式定义的片段,贪婪方式。 a|b:匹配a或b。
():匹配括号内的表达式,也表示一个组。

#.
>>> re.findall('a.b','a1b a,b,asacb,a*b')
['a1b', 'a,b', 'acb', 'a*b']
>>> re.findall('a.b','a\nb')
[]
>>> re.findall('a.b','a\nb',re.S)
['a\nb']
>>> re.findall('a.b','a\nb',re.DOTALL)
['a\nb']

#*
>>> re.findall('ab*','abb,ab!,abbbb')
['abb', 'ab', 'abbbb']
>>> re.findall('ab*','a')
['a']

#+
>>> re.findall('ab+','a')
[]
>>> re.findall('ab+','abbbb,abdaf!')
['abbbb', 'ab']

#?
>>> re.findall('ab?','abbbb,abdaf!')
['ab', 'ab', 'a']
>>> re.findall('ab?','ab')
['ab']
>>> re.findall('ab?','a')
['a']
#匹配所有包含小数在内的数字
>>> re.findall('\d+\.?\d','adsfasfd123,adsaf456.sadf,123.1sd')
['123', '456', '123.1']


#.*默认为贪婪匹配
>>> re.findall('a.*b','asdsbdafewefsdfsb')
['asdsdafewefsdfsb']

#.*?为非贪婪匹配
>>> re.findall('a.*?b','asdsbdfewefsdfsb')
['asdsb']
>>> re.findall('a.*b','asdsbdfewefsdfsb')
['asdsbdfewefsdfsb']

#{n,m}
>>> re.findall('ab{2}','abbbb')
['abb']
>>> re.findall('ab{2,4}','abbbb')
['abbbb']
>>> re.findall('ab{2,4}','abb')
['abb']
>>> re.findall('ab{2,4}','abbb')
['abbb']
>>> re.findall('ab{2,4}','abbbbb')
['abbbb']
>>> re.findall('ab{1,}','abbbbb')#相当于'ab+'
['abbbbb']
>>> re.findall('ab{0,}','abbbbb')#相当于'ab*'
['abbbbb']
>>> re.findall('ab{0,}','aasfa')
['a', 'a', 'a']


#[]
>>> re.findall('a[1*-]b','alb a*b a-b a1*b')
['a*b', 'a-b']
>>> re.findall('a[1*-]b','a1b a*b a-b a1*b')
['a1b', 'a*b', 'a-b']
>>> re.findall('a[1*-.]b','a1b a*b a-b a1*ba.b')
['a1b', 'a*b', 'a-b', 'a.b']
>>> re.findall('a[^1*-.]b','a1b a*b a-ba@b a1*ba.b')
['a@b']
>>> re.findall('a[0-9]b','a1b a*b a-ba@b a1*ba.b')
['a1b']
>>> re.findall('a[a-z]b','a1b a*b a-ba@b a1*bagb')
['agb']
>>> re.findall('a[a-z]b','a1b aZb a-ba@b a1*bagb')
['agb']
>>> re.findall('a[a-zA-Z]b','a1b aZb a-ba@b a1*bagb')
['aZb', 'agb']

#()
>>> re.findall('(ab)+','ababab123')
['ab']
>>> re.findall('ab+','ababab123')
['ab', 'ab', 'ab']
>>> re.findall('(ab)+123','ababab123') #匹配到末尾的ab123中的ab
['ab']
>>> re.findall('(?:ab)+123','ababab123') #findall的结果不是匹配的全部内容,而是组内的内容,?:可以让结果为匹配的全部内容,不只是显示括号里的内容。
['ababab123']

>>> re.findall('href="(.*?)"','www.baidu.com') #只显示()里的内容
['http://www.baidu.com']
>>> re.findall('href="(?:.*?)"','www.baidu.com') #显示所有内容。
['href="http://www.baidu.com"']

>>> re.findall('compan(?:y|ies)','Too many companies have gone bankrupt, and the next one is my company')
['companies', 'company']

re.search()

与findall的用法完全一样,不一样的地方在于search匹配一次就结束了,要想看结果,需要配置.group()来查看,匹配不上会返回None,.group()就只会看匹配到的第一个值。

>>> re.search('alex','alex say alax is sb')
<_sre.SRE_Match object; span=(0, 4), match='alex'>
>>> re.search('alex','alex say alax is sb').group()
'alex'
>>> re.search('alesx','alex say alax is sb').group()
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: 'NoneType' object has no attribute 'group'
>>> re.search('alesx','alex say alax is sb')

re.match()

用法与findall一样,但他是从头匹配,如果第一个没有匹配上,后面就匹配不上,返回的是对象,如果没有匹配上,返回None,它相当于findall加了^这个符号。

>>> re.match('alex','alex say alex is sb').group()
'alex'
>>> re.match('alex','alex say alex is sb').group()
'alex'
>>> re.match('alex','alex say alex is sb')
<_sre.SRE_Match object; span=(0, 4), match='alex'>
>>> re.match('alex','  alex say alex is sb')

re.split()

指定切割符号进行切割,返回列表。

>>> re.split(':','root:x:0:0:/root::bin/bash')
['root', 'x', '0', '0', '/root', '', 'bin/bash']
>>> re.split('a','bcadab b')
['bc', 'd', 'b b']
>>> re.split('ab','bcadab b')
['bcad', ' b']
>>> re.split('ab','abcd')
['', 'cd']
>>>

# 以多个字符进行分割
 >>> re.split("[\d,]","a,b1c")
['a', 'b', 'c']

re.sub()

替换字符,re.sub(old,new,string,num),num表示替换的次数。

>>> re.sub('a','A','alex say alex is sb')
'Alex sAy Alex is sb'
>>> re.sub('a','A','alex say alex is sb',1)
'Alex say alex is sb'
>>> re.sub('(^\w+)(.*?\s)(\w+)(.*?\s)(\w+)$',r'\5\4\3\2\1','alex is sb')#排序
'sb is alex'

re.subn()

用法和re.sub差不多,但会显示替换了几次。

>>> re.subn('a','A','abcde is aaa')
('Abcde is AAA', 4)
>>> re.subn('a','A','abcde is aaa',2)
('Abcde is Aaa', 2)
>>>

re.compile()

正则表达式重用,可以用到这个。

>>> obj=re.compile('^alex')
>>> obj.findall('alex is sb')
['alex']

 

原文链接:python模块之re正则,转载请注明来源!

0