python正则表达式
正则表达式
1.导入re模块:import re
import re
 
# 将正则表达式编译成Pattern对象
pattern = re.compile(r'hello')                         #compile(pattern对象,[匹配模式]),pattern即正则表达式,匹配模式下次再扩充
 
# 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
match = pattern.match('hello world!')                  #match(匹配的文本),也可以直接re.match('pattern对象','匹配的文本'),将前面的pattern上面的句子结合在一起
 
if match:
    # 使用Match获得分组信息
    print match.group()
 
### 输出 ###
# hello
扩展:
search(),match(),findall()区别
match():判断从开始位置是否匹配,如果匹配成功,则返回Match对象,若果匹配不成功则返回None
search():从整体匹配,返回第一个匹配的字符
findall():从整体匹配,返回所有匹配的字符,以列表的形式
>>> pattern=re.compile(r'\bhi\b')
>>> match=pattern.match('kkk,hi,history')           #开始位置为kkk,不是所要匹配的字符hi
>>> if match:
	print match.group()                         #match()从开始位置匹配hi,若不匹配,返回None,即为空
	
>>> pattern=re.compile(r'\bhi\b')
>>> match=pattern.search('kkk,hi,history')         #从整体匹配,返回所第一个匹配的字符
>>> if match:
	print match.group()
	
hi
>>> pattern=re.compile('wh')
>>> match=pattern.findall('where,what,which,why,who are you,wheeuuy')
>>> print match
['wh', 'wh', 'wh', 'wh', 'wh', 'wh']               #以列表形式返回所有匹配的字符
2.匹配字符
注意:
(1)特殊字符需要用‘\’转义,例如‘-’,匹配时为:‘\-’
(2)():分组匹配;{}:制定长度;[]:范围
(3)?的用法
- 原文符号:\?
 - 作为数量词:?匹配0或一个字符
 - 非贪婪匹配
- *? 重复任意次,但尽可能少重复
 - +? 重复1次或更多次,但尽可能少重复
 - ?? 重复0次或1次,但尽可能少重复
 - {n,m}? 重复n到m次,但尽可能少重复
 - {n,}? 重复n次以上,但尽可能少重复
 
 
4.不捕捉模式
| 语法 | 
 说明 
 | 
 实例 
 | 
| (pattern) | 
 匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“\(”或“\)”。 
 | 
|
| 
 (?:pattern) 
 | 
 非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分时很有用。 
 | 
 例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。 
 | 
| 
 (?=pattern) 
 | 
 非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。 
 | 
 例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 
 | 
| 
 (?!pattern) 
 | 
 非获取匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。 
 | 
 例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。 
 | 
| 
 (?<=pattern) 
 | 
 非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反。 
 | 
 例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。 
 | 
| 
 (?<!pattern) 
 | 
 非获取匹配,反向否定预查,与正向否定预查类似,只是方向相反。 
此处用或任意一项都不能超过2位,如“(?<!95|98|NT|20)Windows正确,“(?<!95|980|NT|20)Windows 报错,若是单独使用则无限制,如(?<!2000)Windows 正确匹配 
 | 
 例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。这个地方不正确,有问题 
 | 
表1:预定义字符集,可用在字符集[]中,如[\d]
| 语法 | 说明 | 
| \d | 一个数字 | 
| \D | 非数字 | 
| \w | 一个字母或数字 | 
| \W | 特殊字符 | 
| \s | 空白字符,换行符,空白符,制表符等 | 
| \S | 非空白字符 | 
表2:数量词,不代表字符和位置,而是制定前边的字符的匹配数量,可用在字符或(....)之后,如()?
| 语法 | 说明 | 
| . | 任意一个字符,除换行符外 | 
| * | 任意可变长字符(包括0个) | 
| + | 一个字符或多个 | 
| ? | 0或一个字符 | 
| {n} | 重复n次 | 
| {n,} | 重复n次或大于n次 | 
| {n,m} | 重复n-m次 | 
表3:边界匹配
边界:边界指的是一个位置,而不是一个字符
例如:bakhihi a hdkskjdksa - hhdksjdkj-hdkjdkj
如果我们想匹配a,但不想从其他单词中匹配,只想单独匹配,\ba\b即可匹配,若要匹配非单词的-,同样\B-\B
| 语法 | 说明 | 
| ^x | 行以x开头,多行时匹配每一行开头 | 
| \A | 仅字符串开头 | 
| y$ | 行以y结尾,多行匹配每一行的结尾 | 
| \Z | 仅字符串结尾 | 
| \b | 单词边界匹配,单词的分界线 | 
| \B | 非单词匹配 | 
表4:逻辑,分组
| 语法 | 说明 | 实例 | 结果 | 
| A|B | A或B | a|b | a或b皆可匹配 | 
| () | 分组 |  ^(\d{3})-(\d{3,8})$ | 
123-456789 | 
分组:
例如: ^(\d{3})-(\d{3,8})$
由两个()组成,匹配两个组,可以通过group()取值
>>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
>>> m
<_sre.SRE_Match object; span=(0, 9), match='010-12345'>        #如果正则表达式中定义了组,就可以在Match对象上用group()方法提取出子串来
>>> m.group(0)                        #group(0):指取整个字符串 
'010-12345'
>>> m.group(1)                        #group(1):取第一个分组的内容
'010'
>>> m.group(2)                        #group(2):取第二个分组的内容
'12345'
3.理解贪婪匹配和非贪婪匹配
正则表达式默认是贪婪匹配,即匹配尽可能多的字符。
非贪婪匹配可以使用?,让其尽可能少匹配,见上面?的用法的非贪婪匹配。
例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb"。而如果使用非贪婪的数量词"ab*?",将找到"a"
    博客园暂时不更新,更多知识请移步微信公众号“测试媛学渣笔记”
                    
                
                
            
        
浙公网安备 33010602011771号