码迷,mamicode.com
首页 > 编程语言 > 详细

正则表达式(python3-re模块示例)

时间:2018-11-16 17:36:18      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:group   ups   \n   模式   正则表达   pad   point   bottom   back   

1.常用的正则表达式

.     默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
^     匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
$     匹配字符结尾, 若指定flags MULTILINE ,re.search(foo.$,foo1\nfoo2\n,re.MULTILINE).group() 会匹配到foo1
*     匹配*号前的字符0次或多次, re.search(a*,aaaabac)  结果aaaa
+     匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果[ab, abb]
?     匹配前一个字符1次或0次 ,re.search(b?,alex).group() 匹配b 0次
{m}   匹配前一个字符m次 ,re.search(b{3},alexbbbs).group()  匹配到bbb
{n,m} 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果abb, ab, abb]
|     匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果ABC
(...) 分组匹配, re.search("(abc){2}a(123|45)", "abcabca456c").group() 结果为abcabca45 

\A    只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的,相当于re.match(abc,"alexabc") 或^
\Z    匹配字符结尾,同$ 
\d    匹配数字0-9
\D    匹配非数字
\w    匹配[A-Za-z0-9]
\W    匹配非[A-Za-z0-9]
s     匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 \t
(?P<name>...) 分组匹配

 

2.re模块

re.match(pattern, string[, flags]) 从头开始匹配
re.search(pattern, string[, flags]) 匹配包含
re.findall(pattern, string) 把所有匹配到的字符放到以列表中的元素返回
re.split(pattern, string[, maxsplit=0) 以匹配到的字符当做列表分隔符
re.sub(pattern, replace, string[, count=0] 匹配字符并替换
re.fullmatch 全部匹配

 

2.1 简单例子

>>> import re
>>> s = abc1d3e
         re.match
>>> print(re.match([0-9], s))
None
>>> re.match([0-9], 1bdfd)
<_sre.SRE_Match object; span=(0, 1), match=1>
         re.search
>>> re.search([0-9], s)
<_sre.SRE_Match object; span=(3, 4), match=1>

>>> re.search(‘[0-9]‘, s).group()
‘1‘

# span是类似于切片的索引
         re.findall
>>> re.findall([0-9], s)
[1, 3]
          re.split
>>> re.split(d, s)
[abc1, 3e]>>> s2 = alex99jack88rain77jinxin50
>>> re.split(\d+, s2)
[alex, jack, rain, jinxin, ‘‘]
          re.findall
>>> s1 = aabbaa123
>>> re.findall(a, s1)
[a, a, a, a]

>>> re.findall(‘\d+‘, s2)
[‘99‘, ‘88‘, ‘77‘, ‘50‘]

           re.sub
>>> re.sub(a, c, s1)
ccbbcc123

 

 

3.其他正则表达式

分组匹配

>>> import re
>>> s=alex123
>>> re.search(([a-z]+)([0-9]+), s).group()
(alex123)
>>> re.search(([a-z]+)([0-9]+), s).groups()
(alex, 123)

 

>>> re.search(\d, s)
<_sre.SRE_Match object; span=(4, 5), match=1>
>>> re.search(\d+, s)
<_sre.SRE_Match object; span=(4, 7), match=123>
>>> re.search(\D+, s)
<_sre.SRE_Match object; span=(0, 4), match=alex>

另外一种分组匹配

>>> s1 = 130704200005250613
>>> re.search((?P<province>\d{3})(?P<city>\d{3})(?P<born_year>\d{4}), s1).groupdict()
{province: 130, city: 704, born_year: 2000}

复杂一点的re.sub

>>> re.sub(\d+,_, s3)
alex_jack_rain_\\jinxin_|mac-oldboy
>>> re.sub(\d+,_, s3, count=2)
alex_jack_rain77\\jinxin50|mac-oldboy

re.split

>>> s2 = alex99jack88rain77jinxin50#mac-oldboy
>>> re.split(\d+|#|-, s2)
[alex, jack, rain, jinxin, ‘‘, mac, oldboy]
>>> s4 = 9-2*5/3+7\3*99/4*2998+10*568/14
>>> re.split([-\*/+], s4)
[9, 2, 5, 3, 7\x03, 99, 4, 2998, 10, 568, 14]
>>> re.split([-\*/+], s4, maxsplit=2)
[9, 2, 5/3+7\x03*99/4*2998+10*568/14]

re.fullmatch

>>> re.fullmatch(alex123, alex123)
<_sre.SRE_Match object; span=(0, 7), match=alex123>
>>> re.fullmatch(\w+@\w+\.(com|cn|edu), alex@oldboyedu.com)
<_sre.SRE_Match object; span=(0, 18), match=alex@oldboyedu.com>

re.compile(pattern[,flags])根据包含正则表达式的字符串创建模式对象

>>> pattern = re.compile(\w+@\w+\.(com|cn|edu))
# 如果需要多次的匹配,建议首先把pattern用compile方法转化,这样解释器就不需要每次都转化了。
>>> pattern.fullmatch(alex@oldboyedu.cn)
<_sre.SRE_Match object; span=(0, 17), match=alex@oldboyedu.cn>

 

4.Flags标志符

  • re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
  • M(MULTILINE): 多行模式,改变‘^‘和‘$‘的行为
  • S(DOTALL): 改变‘.‘的行为,make the ‘.‘ special character match any character at all, including a newline; without this flag, ‘.‘ will match anything except a newline.
  • X(re.VERBOSE) 可以给你的表达式写注释,使其更可读,下面这2个意思一样
a = re.compile(r"""\d + # the integral part
                \. # the decimal point
                \d * # some fractional digits""", 
                re.X)

b = re.compile(r"\d+\.\d*")

其他的例子

>>> re.search(a, "Alex", re.I)
<_sre.SRE_Match object; span=(0, 1), match=A>

>>> re.search(foo.$, foo1\nfoo2\n)
<_sre.SRE_Match object; span=(5, 9), match=foo2>
>>> re.search(foo.$, foo1\nfoo2\n, re.M)
<_sre.SRE_Match object; span=(0, 4), match=foo1>

>>> print(re.search(., \n))
None
>>> re.search(., \n, re.S)
<_sre.SRE_Match object; span=(0, 1), match=\n>

>>> print(re.search(.  #test, alex))
None
>>> re.search(.   #test, alex, re.X)
<_sre.SRE_Match object; span=(0, 1), match=a>

正则表达式(python3-re模块示例)

标签:group   ups   \n   模式   正则表达   pad   point   bottom   back   

原文地址:https://www.cnblogs.com/haoqirui/p/9969730.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!