赞
踩
————————————————————————
————————————————————————
1)数量词的贪婪模式与非贪婪模式: (1)正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。 例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb"。 (2)而如果使用非贪婪的数量词"ab*?",将找到"a" ,解释:*?组合就是匹配前面的一个字符按最短匹配。 2)正则表达式的转移符: r"xxx" 表示里面的有转移符的符号不转移。 同样,匹配一个数字的"\\d"可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。 |
N.2.1 match方法
1)re.match(pattern, string, [flags])方法,尝试从字符串的“起始位置”匹配一个模式。匹配成功返回true,不成功,返回false。 | |
flags是可选参数 | 描述 |
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解 |
2)获取匹配结果方法 : re.match(...).group() | |
匹配对象方法 | 描述 |
group(num=0) | 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。 |
groups() | 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号 |
案例: import re # 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None,match方法必须是开头就要匹配成功,不然就无法在往后面继续匹配 reslut1 = re.match(r'.*A',"hello world! AAaaBBbbCCCcccDDDEEDD,AAaaBBbbCCCcccDDDEEDD",re.I) #.*?表示最短的匹配 但是这样使用没什么意义 因为要把 .*? 放到字符串的中间 才有意义,.*Ab和.*Ab.*?的效果是一样的 reslut2 = re.match(r'.*Ab.*?',"hello world! AAaaBBbbCCCcccDDDEEDD,AAaaBBbbCCCcccDDDEEDD",re.I) reslut3 = re.match(r'.*Ab.*?D',"hello world! AAaaBBbbCCCcccDDDEEDD,AAaaBBbbCCCcccDDDEEDD",re.I)# .*?D 表示最短的匹配 if reslut1: # 使用Match获得分组信息 print(reslut1.group()) #hello world! AAaaBBbbCCCcccDDDEEDD,AAaa else: print("no") if reslut2: print(reslut2.group()) #hello world! AAaaBBbbCCCcccDDDEEDD,AAaaB else: # 使用Match获得分组信息else: print("no") if reslut3: # 使用Match获得分组信息 print(reslut3.group()) #hello world! AAaaBBbbCCCcccDDDEEDD,AAaaBBbbCCCcccD else: print("no") |
N.2.2 search方法
1)re.search 扫描整个字符串并返回第一个成功的匹配。 与match方法不一样,match是正则表达式要一开始就要匹配到,而search不需要一开始就要匹配到 |
import re # 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None,search与吗方法必须是开头就要匹配成功,不然就无法在往后面继续匹配 reslut1 = re.search(r'A.*D',"hello world! AAaaBBbbCCCcccDDDEEDD,AAaaBBbbCCCcccDDDEEDD",re.I) # .*?表示最短的匹配 但是这样使用没什么意义 因为要把 .*? 放到字符串的中间 才有意义,Ab.*?和Ab的效果是一样的 reslut2 = re.search(r'Ab.*?',"hello world! AAaaBBbbCCCcccDDDEEDD,AAaaBBbbCCCcccDDDEEDD",re.I) reslut3 = re.search(r'Ab.*?D',"hello world! AAaaBBbbCCCcccDDDEEDD,AAaaBBbbCCCcccDDDEEDD",re.I)# .*?D 表示最短的匹配 if reslut1: # 使用Match获得分组信息 print(reslut1.group()) #AAaaBBbbCCCcccDDDEEDD,AAaaBBbbCCCcccDDDEEDD else: print("no") if reslut2: print(reslut2.group()) #aB else: # 使用Match获得分组信息else: print("no") if reslut3: # 使用Match获得分组信息 print(reslut3.group()) #aBBbbCCCcccD else: print("no") |
N.2.3 findall方法
import re s = "aabbcc 123abc aa bb cc aa bb cc" print(re.findall(r'aa', s))#['aa', 'aa', 'aa']有4出有aa print(re.findall(r'\baa\b', s))#['aa', 'aa'] #r'字符串'表示里面的转移符作为输出使用 r"\baa\b"表示以aa开头 以aa结尾的单词 所以\b 表示单词边界的意思 |
N.2.4 split方法
split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下: re.split(pattern, string[, maxsplit=0, flags=0]) | |
参数 | 描述 |
pattern | 匹配的正则表达式 |
string | 要匹配的字符串。 |
maxsplit | 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志 |
案例: import re #结果 ['runoob', 'runoob', 'runoob', 'AA', 'BB', 'CC', 'DD'] reslut=re.split('\W', 'runoob;runoob;runoob;AA(BB-CC)DD') print(reslut) #结果 ['runoob', 'runoob', 'runoob', 'AA', 'BB', 'CC', 'DD', ''] reslut1=re.split('\W', 'runoob;runoob;runoob;AA(BB-CC)DD-') #如果后面是一个非字母 则结果最后有一个双引号 print(reslut1) |
Python 的re模块提供了re.sub用于替换字符串中的匹配项。 语法:re.sub(pattern, repl, string, count=0, flags=0) 参数: ● pattern : 正则中的模式字符串。 ● repl : 替换的字符串,也可为一个函数。 ● string : 要被查找替换的原始字符串。 ● count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。 ● flags : 编译时用的匹配模式,数字形式 |
import re phone = "182-9635-8567 号码来自江西" #删除后面的文字 num = re.sub(r'号码来自.*$', "号码来自北京", phone) # $表示匹配字符串末尾 从后往前匹配 print(num) # 182-9635-8567 号码来自北京 #移除非数字的内容 num = re.sub(r'\D', " ", phone) print(num)# 182 9635 8567 phone1 = "这是电话号码:182-9635-8567" #删除前面的文字 num = re.sub(r'^.*号码:', "小明的号码 ", phone1) # $表示匹配字符串末尾 从后往前匹配 print(num) # 小明的号码 182-9635-8567 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。