千锋的第十五天
2018-08-03 本文已影响59人
堪怜咏絮才
一、正则表达式的符号
正则表达式:用来做字符串查找、匹配、切割用的一种工具
正则表达式:是一个符合正则规范的字符串
match:从开始匹配,成功则停止------部分匹配
fullmatch:用整个字符串去匹配------完全匹配
- 点(.) :匹配一个任意字符
- \w :匹配一个字符是字母、数字或下划线(w---word)
- \s :匹配一个空白字符(空格,换行,制表符)(s----space)
- \d :匹配一个数字字符(d-----digital)
- \b :检测边界(字符串开头,字符串结尾都是边界,边界指的是单词边界---一般的符号都可以作为单词边界)(b-----边界)
- ^ :检测字符串开始(The-----匹配以The开头的字符串)(检测开头)
- :检测字符串结束-------(-----检测结尾)
- \W :匹配非字母、数字、下划线-------(\W---匹配非字母数字下划线
- \S :匹配非空白字符
- \D :匹配非数字
- \B :检测非边界
二、正则表达式的符号组合
- [] :匹配[]中出现的任意一个字符(只能一个)
[0-9]:匹配0,1,2,3,4,5,6,7,8,9中的任意一个数字
[0-8]:匹配0,1,2,3,4,5,6,7,8中的任意一个数字
[a-z]:匹配任意一个小写字母
[A-Z]:匹配任意一个大写字母
[a-zA-Z]:匹配所有的字母 - [^] :匹配不在[]中出现的任意一个字符
- :匹配0次或者多次
- :匹配一次或者多次
- ? :匹配0次或者1次
- {N} :匹配N次
- {N,} :匹配大于等于N次
- {M,N} :匹配至少M次,最多N次
- | :分支(相当于or)
- () :匹配的时候是分组,让括号中的正则条件变成一个整体
正则中:. \ [] {} () * + ? ^ | $,这些字符有特殊意义,所以在正则表达式中,如果想要单纯的表达这些字符,需要在前面加'';
注意:1. - 号在中括号中可能是特殊符号,需要加
2. . {} () * + ? $ | 在中括号中可以不加\,来表示字符
\N----->匹配前面第N个组中匹配到的内容(将第N组的内容重复一遍)
三、模块方法
- compile() 将正则表达式字符串转换成正则表达式对象
转换成正则表达式对象后,可以通过对象调用相关的方法 - fullmatch(正则表达式,字符串)完全匹配,从开始匹配到结尾
返回值是匹配对象,如果失败返回None - match(正则表达式,字符串)不完全匹配,从字符串开头开始匹配,匹配到正则表达式的范围为止
返回值是匹配对象,如果匹配失败返回None
4.search(正则表达式,字符串)在指定的字符串中查找某种字符串(以正则表达式来描述) 如果有多个满足条件的,只匹配第一个,返回值是匹配对象
返回值是匹配对象,如果找不到符合要求的返回None
5.findall(正则表达式,字符串)获取指定字符串中满足正则条件的所有的字符串
返回值是列表,列表中是符合要求的字符串.没有满足要求的字符串就返回空的列表[]
6.finditer(正则表达式,字符串)用法和findall一样,只是返回值的类型不一样
返回一个迭代器,迭代器中的内容是匹配对象
注意:()捕获部分无效
7 . split(正则表达式,字符串)按正则表达式匹配到的字符串进行切割
返回值是列表,列表元素就是切割后被分段的字符串 - sub(正则表达式,新字符串,原字符串) 在原字符串中查找符合正则的子串替换成新的字符串
返回值是替换后的字符串
作业
⼀.获取字符串中:
a.所有的正整数
b.所有的负整数
c.所有的浮点数
d.所有的⾮负浮点数
import re
str1 = '5hjfka154hbjkafdv4665sh&&^%$n,nfkalfnf'
re_str1 = r'[+]?[1-9]\d*'
result1 = re.findall(re_str1,str1)
print(result1)
re_str2 = r'[-][1-9]\d*'
str2 = '-456sjkfh-645()(&&ak-jsn-5553'
result2 = re.findall(re_str2,str2)
print(result2)
re_str3 = '[+-]?\d+.\d+'
str3 = 'hsk+41.85hjkdi-15561.51(*&^%$$-5661.56'
result3 = re.findall(re_str3,str3)
print(result3)
re_str4 = '[+]?\d+.\d+'
str4 = '+356.332ufhkfh-6468.16joijf64615'
result4 = re.findall(re_str4,str4)
print(result4)
结果:['5', '154', '4665']
['-456', '-645', '-5553']
['+41.85', '-15561.51', '-5661.56']
['+356.332', '6468.16', '64615']
- 能够完全匹配字符串“(010)-62661617”和字符串“01062661617”的正则表达式包括()
A. “(?\d{3})?-?\d{8}”
B. “[0-9()-]+”
C. “[0-9(-)]\d”
D. “[(]?\d[)-]\d*”
答案:A、B、D - 能够完全匹配字符串“c:\rapidminer\lib\plugs”的正则表达式包括()
A. “c:\rapidminer\lib\plugs”
B. “c:\rapidminer\lib\plugs”
C. “(?i)C:\RapidMiner\Lib\Plugs” ?i:将后⾯的内容的⼤写变成⼩写
D. “(?s)C:\RapidMiner\Lib\Plugs” ?s:单⾏匹配
答案:D(因为匹配\要用两个\才能够实现) - 能够完全匹配字符串“back”和“back-end”的正则表达式包括()
短路操作:前⾯的为真了,就不会再执⾏后边的操作
A. “\w{4}-\w{3}|\w{4}”
B. “\w{4}|\w{4}-\w{3}”
C. “\S+-\S+|\S+”
D. “\w\b-\b\w|\w*”
答案:A、B、C - 能够完全匹配字符串“go go”和“kitty kitty”,但不能完全匹配“go kitty”的正则表达式包括()
:\1就是重复前⾯第⼀个()/组合⾥⾯的内容
: \2就是重复前⾯第⼆个()/组合⾥⾯的内容
A. “\b(\w+)\b\s+\1\b”
B. “\w{2,5}\s*\1”
C. “(\S+) \s+\1”
D. “(\S{2,5})\s{1,}\1”
答案:A、C、D - 能够在字符串中匹配“aab”,⽽不能匹配“aaab”和“aaaab”的正则表达式包括()
A. “a*?b”
B. “a{,2}b”
C. “aa??b”
D. “aaa??b”
答案:B、C、D
"""三.观察下⾯双引号内的⽂本”中⽂名 ⻉拉克·侯赛因·奥巴⻢ 外⽂名 Barack Hussein Obama II 别 名 欧巴⻢ 国
籍美国 ⺠ 族 德裔族 出⽣地 美国夏威夷州檀⾹⼭ 出⽣⽇期 1961年8⽉4⽇ 职 业政治家、律师、总统 毕业院
校哥伦⽐亚⼤学,哈佛⼤学 信 仰新教 主要成就 1996年伊利诺伊州参议员 主要成就美国第56届、 57届总统
2009年诺⻉尔和平奖获得者 时代周刊年度⻛云⼈物2008、 2011 任期内清除本·拉登 代表作品 《我相信变⾰》《我⽗亲的梦想》《⽆畏的希望》 所属政党美国⺠主党 ⾎ 型 AB型 学 院⻄⽅学院 妻 ⼦⽶歇尔·拉沃恩·
奥巴⻢ 性 别 男”
a. (此题为示范题)当使⽤正则表达式“中⽂名\s+(\S+)\s+”抽取美国总统奥巴⻢的中⽂名时,替换字符
串“1”的赋值为需要抽取的中⽂名。 b. 当使⽤正则表达式“___________”抽取美国总统奥巴⻢的外⽂名时,替换字符串“1”的赋值为需要抽取的
外⽂名。
c. 当使⽤正则表达式“___________________________”抽取美国总统奥巴⻢的出⽣⽇期时,替换字符
串“1”的赋值为需要抽取的出⽣⽇期。 d. 使⽤正则表达式“_________________________”抽取美国总统奥巴⻢的职业时,替换字符串“1”的赋值
为需要抽取的职业。
e. 使⽤正则表达式“___________________________”抽取美国总统奥巴⻢的主要成就时,替换字符
串“1”的赋值为需要抽取的主要成就。 f. 使⽤正则表达式“______________________________”抽取美国总统奥巴⻢的妻⼦姓名时,替换字符 串“1”的赋值为需要抽取的姓名。"""
import re
str1 = "中⽂名 ⻉拉克·侯赛因·奥巴⻢ 外⽂名 Barack Hussein Obama II 别 名 欧巴⻢ 国
籍美国 ⺠ 族 德裔族 出⽣地 美国夏威夷州檀⾹⼭ 出⽣⽇期 1961年8⽉4⽇ 职 业政治家、律师、总统 毕业院
校哥伦⽐亚⼤学,哈佛⼤学 信 仰新教 主要成就 1996年伊利诺伊州参议员 主要成就美国第56届、 57届总统
2009年诺⻉尔和平奖获得者 时代周刊年度⻛云⼈物2008、 2011 任期内清除本·拉登 代表作品 《我相信变⾰》《我⽗亲的梦想》《⽆畏的希望》\ 所属政党美国⺠主党 ⾎ 型 AB型 学 院⻄⽅学院 妻⼦ ⽶歇尔·拉沃恩·
奥巴⻢ 性 别 男"
re_str1 = r'\b[a-zA-Z]* [a-zA-Z]* [a-zA-Z]* II'
result1 = re.findall(re_str1,str1)
print(re.sub(result1[0],'$1',str1))
re_str2 = r'\d{4}\S\d+\S\d+\S'
result2 = re.findall(re_str2,str1)
print(re.sub(result2[0],'$1',str1))
re_str3 = r'\S{3}、\S{2}、\S{2}'
result3 = re.search(re_str3,str1)
print(re.sub(result3.group(),'$1',str1))
result4 =re.split(r'[教代]',str1)
str2 = result4[1]+'代'+result4[2]
print(re.sub(str2,'$1',str1))
re_str4 = r'\S{3}·\S{3}·'
result5 = re.findall(re_str4,str1)
print(re.sub(result5[1],'$1',str1))