python 基础 - 4.15 re模块

Posted 如果迎着风就飞,俯瞰这世界有多美

tags:

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

请从以下文件里取出所有的手机号

姓名        地区    身高    体重    电话
况咏蜜     北京    171    48    13651054608
王心颜     上海    169    46    13813234424
马纤羽     深圳    173    50    13744234523
乔亦菲     广州    172    52    15823423525
罗梦竹     北京    175    49    18623423421
刘诺涵     北京    170    48    18623423765
岳妮妮     深圳    177    54    18835324553
贺婉萱     深圳    174    52    18933434452
叶梓萱    上海    171    49     18042432324
杜姗姗    北京    167    49     13324523342

找到全部电话

f = open("联系方式",r,encoding="utf-8")
phones = []
for line in f:
    name,city,height,weight,phone = line.split()
    if phone.startswith(1) and len(phone) == 11:
        phones.append(phone)
print(phones)

运行

[13651054608, 13813234424, 13744234523, 15823423525, 18623423421, 18623423765, 18835324553, 18933434452, 18042432324, 13324523342]

 使用正则表达式

手机号是有规则的,都是数字且是11位,再严格点,就都是1开头,如果能把这样的规则写成代码,直接拿规则代码匹配文件内容不就行了?

import re
f = open("联系方式",r,encoding="utf-8")
data = f.read()print(re.findall("1[0-9]{10}",data))

运行

[13651054608, 13813234424, 13744234523, 15823423525, 18623423421, 18623423765, 18835324553, 18933434452, 18042432324, 13324523342]

这么nb的玩法是什么?它的名字叫正则表达式

re模块

正则表达式就是字符串的匹配规则,在多数编程语言里都有相应的支持,python里对应的模块是re

常用的表达式规则

.     默认匹配除\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>...) 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") 结果{province: 3714, city: 81, birthday: 1993}

re的匹配语法有以下几种

  • re.match 从头开始匹配
  • re.search 匹配包含
  • re.findall 把所有匹配到的字符放到以列表中的元素返回
  • re.split 以匹配到的字符当做列表分隔符
  • re.sub 匹配字符并替换
  • re.fullmatch 全部匹配

match 从头开始匹配也就是开头必须是什么   匹配到就返回,返回一个对象

In [1]: import re
In [2]: s = abc1d3e
In [3]: re.match("[0-9]",s) # 没有匹配到,因为不是以数字开头的
In [4]: print(re.match("[0-9]",s))
None

In [5]: re.match("[0-9]",1dds2)  # 匹配到一个,但是只匹配一个
Out[5]: <_sre.SRE_Match object; span=(0, 1), match=1>
In [6]: re.match("[0-9]",12dds2)
Out[6]: <_sre.SRE_Match object; span=(0, 1), match=1>

 

search 全局匹配,  匹配到就返回,返回一个对象

In [8]: s = abc1d3e
In [9]: re.search("[0-9]",s)
Out[9]: <_sre.SRE_Match object; span=(3, 4), match=1>  # span是索引

搜索到才能group返回,否则报错

ret = re.search("[0-9]",s)  # 先匹配
if ret:                     # 判断要是匹配到的话,就打印
    print((ret).group())
In [19]: s
Out[19]: abc1d3e
In [20]: ret = re.search("[0-9]",s)  
In [21]: ret
Out[21]: <_sre.SRE_Match object; span=(3, 4), match=1>
In [22]: ret.group()  # 匹配到了
Out[22]: 1
In [23]: ret = re.search("[0]",s) # 没有匹配到,后面打印就报错
In [24]: ret.group()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-24-57f777bf89c0> in <module>()
----> 1 ret.group()

AttributeError: NoneType object has no attribute group

 

findall 全局搜索,匹配到所有,返回列表(找到的值,放在列表里,返回这个列表)

In [10]: s = abc1d3e
In [11]: re.findall("[0-9]",s)
Out[11]: [1, 3]

 

. 匹配

In [31]: re.search(".",abc)
Out[31]: <_sre.SRE_Match object; span=(0, 1), match=a>

In [32]: re.search("..",abc)
Out[32]: <_sre.SRE_Match object; span=(0, 2), match=ab>

^匹配,匹配开头

In [33]: re.search("^a",abc)
Out[33]: <_sre.SRE_Match object; span=(0, 1), match=a>

In [34]: re.search("^a",bc)

其实就和是match等效

In [36]: re.match("ab",abc)
Out[36]: <_sre.SRE_Match object; span=(0, 2), match=ab>

In [37]: re.search("^ab",abc)
Out[37]: <_sre.SRE_Match object; span=(0, 2), match=ab>

$匹配,匹配结尾

In [37]: re.search("^ab",abc)
Out[37]: <_sre.SRE_Match object; span=(0, 2), match=ab>

In [38]: re.search("b$",abc)

In [39]: re.search("b$",ab)
Out[39]: <_sre.SRE_Match object; span=(1, 2), match=b>

In [40]: re.search("^b$",ab)

In [41]: re.search("^b$",b)
Out[41]: <_sre.SRE_Match object; span=(0, 1), match=b>

In [42]: re.search("^ab$",b)

In [43]: re.search("^ab$",ab)
Out[43]: <_sre.SRE_Match object; span=(0, 2), match=ab>

* 匹配,匹配0从以上(包括0)前面那一个字符0次或者多次

In [48]: re.search("a*",A).group()
Out[48]: ‘‘

In [49]: re.search("a*",a).group()
Out[49]: a

In [50]: re.search("a*",aaaa).group()
Out[50]: aaaa

In [51]: re.search("a*",aba).group()
Out[51]: a

+匹配,匹配1从以上(包括1)前面那一个字符1次或者多次

In [55]: re.search("a+",ba).group()
Out[55]: a

In [56]: re.search("a+",ba).group()
Out[56]: a

In [57]: re.search("ab+",ab).group()
Out[57]: ab

In [58]: re.search("ab+",abb).group()
Out[58]: abb

In [59]: re.search("ab+",aab).group()
Out[59]: ab

In [60]: re.search("ab+",aa).group()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-60-f3c555bffe05> in <module>()

?匹配,匹配0或者1次 前面那一个字符0或者1次 

In [61]: re.search("ab?",aa).group()
Out[61]: a

In [62]: re.search("ab?",ab).group()
Out[62]: ab

In [63]: re.search("ab?",abb).group()
Out[63]: ab

{m},{n,m}

In [64]: re.search("[0-9]{1}",123).group()
Out[64]: 1

In [65]: re.search("[0-9]{2}",123).group()
Out[65]: 12

In [66]: re.search("[0-9]{2,3}",123).group()
Out[66]: 123

In [67]: re.search("[0-9]{1,3}",123).group()
Out[67]: 123

| 或  匹配到就返回

In [68]: re.search("a|b",anc).group()
Out[68]: a

In [69]: re.search("a|b",anba).group()
Out[69]: a

In [70]: re.search("a|b",nba).group()
Out[70]: b

In [71]: re.search("a|b|c",nba).group()
Out[71]: b

In [72]: re.search("a|b|c",cnba).group()
Out[72]: c
In [75]: re.search("cmz|CMZ",cmzCMZ).group()
Out[75]: cmz

In [76]: re.search("cmz|CMZ",CMZ).group()
Out[76]: CMZ

In [77]: re.search("cmz|CMZ",cmz).group()
Out[77]: cmz

In [78]: re.search("[c|C]mz",cmz).group()
Out[78]: cmz

In [79]: re.search("[c|C]mz",Cmz).group()
Out[79]: Cmz

()分组匹配

In [83]: re.search("([a-z]+)([0-9]+)",cmz123).groups()
Out[83]: (cmz, 123)

带名字分组匹配

In [109]: s
Out[109]: 1307044200005250613

In [110]: ret=re.search( (?P<province>\d{3})(?P<city>\d{3})(?P<born_year>\d{4}),s)

In [111]: ret.group()
Out[111]: 1307044200

In [112]: ret.groupdict()
Out[112]: {born_year: 4200, province: 130, city: 704}

In [113]: ret.groupdict()[born_year]
Out[113]: 4200

In [114]: ret.groupdict()[province]
Out[114]: 130

In [115]: ret.groupdict()[city]
Out[115]: 704

 

以上是关于python 基础 - 4.15 re模块的主要内容,如果未能解决你的问题,请参考以下文章

Python基础之re模块

python基础学习(十三)

python基础学习笔记(十三)

Python基础13_正则表达式,re模块,

Python 基础之re 模块

python基础之re模块