python中正则基本概念(默认是贪婪匹配): 贪婪模式:一直匹配到最大满足条件。 非贪婪模式:匹配到最小满足条件情况。 关键字字符: . 任意一个字符 * {0,无穷} 贪婪匹配 ? 等价于{0,1}? 0个或者1个,贪婪匹配。 + {1,无穷} 贪婪匹配 | 或表达式 表达式1|表达式2|表达式3 可以匹配多个满足结果的表达式。 [] 匹配括号内的任意一个字母。 {m,n} 匹配前面的字母或者表达式m到n次。 \w 匹配字母数字和下划线 \W \w的逆运算 \d 匹配0-9的数字==[0-9] \D 非数字 贪婪模式转非贪婪模式:需要加问号? 如匹配?的贪婪匹配:对?进行转化 import re a="abc#ab" #匹配##包裹的dog和cat result=re.findall("(?:a)(?:b)c?",a) # print(result) #['abc', 'ab'] result=re.findall("(?:a)(?:b)c??",a) print(result) #['ab', 'ab'] 匹配{m,n}的贪婪匹配,对{}进行转化 import re a="abcdef#ijkl#gh#" result=re.findall("[a-z]{3,6}",a) print(result) #['abcdef', 'ijkl'] result=re.findall("[a-z]{3,6}?",a) print(result) #['abc', 'def', 'ijk'] 匹配.*?的贪婪匹配转化 import re a="hello###word***word" result=re.findall("hello.*word",a) print(result) #['hello###word***word'] result=re.findall("hello.*?word",a) print(result) #['hello###word'] 匹配非字母和数字问题: re.findall(“[^a-zA-Z0-9]”,a) #匹配非英文字母和非数字 \W==[^a-zA-Z0-9_] #匹配非英文字母和非数字和非下划线。 正则表达式匹配关键字(满足条件的下标):使用m.start()方法 [m.start() for m in re.finditer(“hello”,String)]
正则中前瞻(又叫零宽断言):注意(?:不属于这个范围,能保存匹配到的字符)
零宽断言不会取匹配到的字符串,忽略对字符串的保存,匹配到的字符串
?= 代表零宽度正预测先行断言,它断言自身出现的位置的后面可以匹配后面跟的表达式。
?<= 代表零宽度正回顾后发断言,它断言自身出现的位置的前面可以匹配后面跟的表达式。
?! 代表零宽度负预测先行断言,它断言自身出现的位置的后面不可以匹配后面跟的表达式。
?<! 代表零宽度负回顾后发断言,它断言自身出现的位置的后面不可以匹配后面跟的表达式。
提前看后面的字符,在下次匹配中匹配提前看到的字符:(?=)(?!)只能放在匹配的后面
pattern(?=pattern):匹配后面满足的模式的字符串。肯定先行断言
pattern(?!pattern):匹配后面不满足的模式的字符串。否定先行断言
比如匹配windows95windows2000中满足windows95和windows2000的windows
re.findall("windows(?:95|2000)|95",a) ['windows95', 'windows2000'] 影响后面95匹配
re.findall("windows(?=95|2000)|95",a) ['windows', '95', 'windows'] 不会影响后面的
re.findall("windows(?!95|2000)|95",a) ['95'] 影响后面
回溯后面的字符,虽然之前的字符已经考虑过可以回溯:(?<=)(?<!)只能放在匹配的前面
(?<=pattern)pattern:匹配前面已经匹配过满足的字符串。肯定回溯断言
(?<!pattern)pattern: 匹配前面已经匹配过不满足的字符串。否定回溯断言
匹配空格内的单词:a="a b c d e"
re.findall("(?<= )[a-z](?= )",a) ['b', 'c', 'd'] 断言匹配不会匹配括号内的。