re模块、正则表达式
一、正则表达式 1、正则表达式不是Python独有的,它是一门独立的技术,所有的编程语言都可以使用正则表达式,在Python中使用正则表达式就要借助于re模块,或者是支持正则表达式书写的方法。 2、用途:筛选字符串中的特定内容 3、应用场景:爬虫、数据分析 4、想要匹配具体的内容,可以直接写完整的内容,不需要写正则 5、字符组[]里面的表达式都是或的关系 6、^与$连用可以精准限制匹配的内容,两者中间写什么,匹配的字符串就必须是什么,多一个不行少一个也不行 7、类似于abc|ab这种结构的表达式? 一定要将长的放前面 8、贪婪匹配: ①、正则表达式默认贪婪匹配 ②、可以通过在量词后面加上一个?将贪婪匹配变成非贪婪匹配(惰性匹配) 9、量词必须跟在正则符号的后面,量词只能限制紧挨着它的那一个正则符号 10、分组:当多个正则符号需要重复多次的时候或者当做一个整体进行其他操作,那么可以利用分组,分组在正则中的语法就是() 11、举个例子,判断一串数字是否是手机号,或者从一串数字中找出符合规则的手机号 # 纯python代码校验 while True: phone_number = input(‘please input your phone number : ‘) if len(phone_number) == 11 and phone_number.isdigit() and (phone_number.startswith(‘13‘) or phone_number.startswith(‘14‘) or phone_number.startswith(‘15‘) or phone_number.startswith(‘18‘)): print(‘是合法的手机号码‘) else: print(‘不是合法的手机号码‘) # 正则表达式校验 import re phone_number = input(‘please input your phone number : ‘) if re.match(‘^(13|14|15|18)[0-9]{9}$‘,phone_number): print(‘是合法的手机号码‘) else: print(‘不是合法的手机号码‘) 二、正则表达式的书写 1、元字符 . 匹配出换行符以外的任意字符 w ? 匹配字母或数字或下划线 s ? ? ? ?匹配任意的空白符 d 匹配数字 n 匹配一个换行符 t 匹配一个制表符 b 匹配一个单词的结尾 ^ 匹配字符串的开始 $ 匹配字符串的结尾 W 匹配非字母或数字或下划线 D 匹配非数字 S 匹配非空白符 a|b 匹配字符a或字符b () 匹配括号内的表达式,也表示一个组 [...] 匹配字符组中的字符 [^...] 匹配除了字符组中字符的所有字符 2、量词 * 重复零次或更多次 + 重复一次或更多次 ? 重复零次或一次 {n} 重复n次 {n,} 重复n次或更多次 {n,m} 重复n到m次 三、转义符 在正则表达式中,有很多有特殊意义的是元字符,比如n和s等,如果要在正则中匹配正常的"n"而不是"换行符"就需要对""进行转义,变成‘‘。 在python中,无论是正则表达式,还是待匹配的内容,都是以字符串的形式出现的,在字符串中也有特殊的含义,本身还需要转义。所以如果匹配一次"n",字符串中要写成‘n‘,那么正则里就要写成"\n",这样就太麻烦了。这个时候我们就用到了r‘n‘这个概念,此时的正则是r‘n‘就可以了。
四、贪婪匹配 1、贪婪匹配:在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配
2、几个常用的非贪婪匹配Pattern *? 重复任意次,但尽可能少重复 +? 重复1次或更多次,但尽可能少重复 ?? 重复0次或1次,但尽可能少重复 {n,m}? 重复n到m次,但尽可能少重复 {n,}? 重复n次以上,但尽可能少重复 3、.*?的用法 . 是任意字符 * 是取 0 至 无限长度 ? 是非贪婪模式 合在一起就是取尽量少的任意字符,一般不会这么单独写,他大多用在: .*?x 就是取前面任意长度的字符,直到一个x出现 ?五、re模块 import re ret = re.findall(‘a‘,‘eva egon yuan‘) # 返回所有满足匹配条件的结果,放在列表里 print(ret) #结果 : [‘a‘,‘a‘] ret = re.search(‘a‘,‘eva egon yuan‘).group() print(ret) #结果 : ‘a‘ # 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以 # 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。 ret = re.match(‘a‘,‘abc‘).group() # 同search,不过尽在字符串开始处进行匹配 print(ret) #结果 : ‘a‘ ret = re.split(‘[ab]‘,‘abcd‘) # 先按‘a‘分割得到‘‘和‘bcd‘,在对‘‘和‘bcd‘分别按‘b‘分割 print(ret) # [‘‘,‘‘,‘cd‘] ret = re.sub(‘d‘,‘H‘,‘eva3egon4yuan4‘,1)#将数字替换成‘H‘,参数1表示只替换1个 print(ret) #evaHegon4yuan4 ret = re.subn(‘d‘,‘eva3egon4yuan4‘)#将数字替换成‘H‘,返回元组(替换的结果,替换了多少次) print(ret) obj = re.compile(‘d{3}‘) #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字 ret = obj.search(‘abc123eeee‘) #正则表达式对象调用search,参数为待匹配的字符串 print(ret.group()) #结果 : 123 import re ret = re.finditer(‘d‘,‘ds3sy4784a‘) #finditer返回一个存放匹配结果的迭代器 print(ret) # <callable_iterator object at 0x10195f940> print(next(ret).group()) #查看第一个结果 print(next(ret).group()) #查看第二个结果 print([i.group() for i in ret]) #查看剩余的结果 注意: 1、findall的优先级查询: import re ret = re.findall(‘www.(baidu|oldboy).com‘,‘www.oldboy.com‘) print(ret) # [‘oldboy‘] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可 ret = re.findall(‘www.(?:baidu|oldboy).com‘,‘www.oldboy.com‘) print(ret) # [‘www.oldboy.com‘] 2、split的优先级查询 ret=re.split("d+","eva3egon4yuan") print(ret) #结果 : [‘eva‘,‘egon‘,‘yuan‘] ret=re.split("(d+)",‘3‘,‘4‘,‘yuan‘] #在匹配部分加上()之后所切出的结果是不同的, #没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项, #这个在某些需要保留匹配部分的使用过程是非常重要的。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ExtJs4 笔记(4) Ext.Ajax 对ajax的支持
- 纯前端表格控件SpreadJS V11.2新版本发布,全面支持React和
- 用于使用命令行选项的ruby习语
- 数组 – 有一个原因,Swift数组赋值是不一致的(既不是引用也
- macos – 如何通过Swift中的URLScheme捕获用于启动OSX应用程
- c# – 简单的try / catch没有使用异常
- 依赖注入 – 将DI容器注入(几乎)每个类是一种反模式吗?
- 非托管C垃圾收集帮助
- 文本文件里如何快速在每行头尾都加上指定的内容---正则表达
- React.createElement: type is invalid -- expected a stri