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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式(python3-re模块示例)相关的知识,希望对你有一定的参考价值。

1.常用的正则表达式

.     默认匹配除
之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
^     匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","
abc
eee",flags=re.MULTILINE)
$     匹配字符结尾, 若指定flags MULTILINE ,re.search(foo.$,foo1
foo2
,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") 或^
    匹配字符结尾,同$ 
d    匹配数字0-9
D    匹配非数字
w    匹配[A-Za-z0-9]
W    匹配非[A-Za-z0-9]
s     匹配空白字符、	、
、
 , re.search("s+","ab	c1
3").group() 结果 	
(?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+73*99/4*2998+10*568/14
>>> re.split([-*/+], s4)
[9, 2, 5, 3, 7x03, 99, 4, 2998, 10, 568, 14]
>>> re.split([-*/+], s4, maxsplit=2)
[9, 2, 5/3+7x03*99/4*2998+10*568/14]

re.fullmatch

>>> re.fullmatch(alex123, alex123)
<_sre.SRE_Match object; span=(0, 7), match=alex123>
>>> re.fullmatch([email protected]w+.(com|cn|edu), [email protected])
<_sre.SRE_Match object; span=(0, 18), match=[email protected]>

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

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

 

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
foo2
)
<_sre.SRE_Match object; span=(5, 9), match=foo2>
>>> re.search(foo.$, foo1
foo2
, re.M)
<_sre.SRE_Match object; span=(0, 4), match=foo1>

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

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


以上是关于正则表达式(python3-re模块示例)的主要内容,如果未能解决你的问题,请参考以下文章

常用模块-正则re

python 正则表达式 re模块基础

Python正则表达式

python中的re模块

通过 Java 正则表达式提取 semver 版本字符串的片段

俗话:学好正则表达式,走遍天下都没事!最详细的正则入门教程!