12°

2. 正则中特殊符号所代表的含义与例子

  1. .

    点字符默认情况下表示任意字符,但是不包括\n

    可以通过flag标志来声明.点匹配包括\n

    • 不包括换行
      	import re
      	ret = re.match(".*","hello\\\nhello")
      	print(ret.group())
      
    • 包括换行
      	import re
      	ret = re.match(".*","hello\\\nhello",re.DOTALL)
      	print(ret.group())
      

    re.DOTALL表示匹配所以字符。

  2. ^ 行首

    ^表示这一行必须是以某种规则开始。

    ^re.MULTILINE模式中,表示按照\n为分界线,进行一行一行的方式解析。

    • 普通行首
      	import re
      	ret = re.match("^hel.*","hello\\\nhello")
      	print(ret.group())
      
    • 多行匹配
      	import re
      	ret = re.match("^hel.*\n^hel.*","hello\\\nhello",re.MULTILINE)
      	print(ret.group())
      
      注意:这里有两个^,以及添加了re.MULTILINE
  3. $ 行末尾

    筛选以某种规则结尾的字符串。

    • 非多行
      	import re
      	ret = re.findall(".+$","hello world\\\nhello")
      	print(ret)
      
    • 多行
      	import re
      	ret = re.findall(".+$","hello world\\\nhello",re.MULTILINE)
      	print(ret)
      
  4. * 贪婪匹配

    尽量多的匹配,*等价于{0,INFINITY} INFINITY表示无穷大,后面也一样。

    	import re
    	ret = re.findall(".*","hello world\\\nhello")
    	print(ret)
    
  5. + 多个

    尽量多的匹配,+等价于{1,INFINITY}

    	import re
    	ret = re.findall(".+","hello world\\\nhello")
    	print(ret)
    
  6. ? 0或1

    尽量多的匹配一个或0个,.?等价于{0,1}

    	import re
    	ret = re.findall(".?","hello world\\\nhello")
    	print(ret)
    
  7. *? +? ??非贪婪匹配,尽量少的匹配

    与上面三个相反。

    • 贪婪模式
      	import re
      	ret = re.findall("<.*>","<html></html>")
      	print(ret)
      
    • 非贪婪模式
      	import re
      	ret = re.findall("<.*?>","<html></html>")
      	print(ret)
      
  8. {m} 严格匹配m个重复字符

    	import re
    	ret = re.findall("a{1}","a<html>a</html>")
    	print(ret)
    
  9. {m,n} 至少m个,最多n个。

    贪婪匹配,尽可能多的匹配。

    	import re
    	ret = re.findall("a{1,5}","aaaaa<html>a</html>")
    	print(ret)
    
  10. {m,n}?非贪婪模式匹配

    import re
    ret = re.findall("a{1,5}?","aaaaa<html>a</html>")
    print(ret)
    
  11. []集合中任选一个

    []只代表一个字符,即,括号之间的所有字符中的任意一个可以满足.

    并且这里面的所有的字符都失去它原来的特殊意义。

    几种声明方式,一一列举,范围列举,集合,取反

    • 一一列举
      	import re
      	ret = re.findall("[a<]+","aaaaa<html>a</html>")
      	print(ret)
      
    • 范围罗列
      	import re
      	ret = re.findall("[a-z]+","aaaaa<html>a</html>")
      	print(ret)
      
    • 集合
      	import re
      	ret = re.findall("[\\w]+","aaaaa<html>a</html>")
      	print(ret)
      
    • 取反
      	import re
      	ret = re.findall("[^\\w]+","aaaaa<html>a</html>")
      	print(ret)
      
  12. | 多个表达式,从左往右匹配。

    import re
    ret = re.findall("(a|h)+","aaaaa<html>a</html>")
    print(ret)
    
  13. (...) 创建组

    对于括号里面的表达式,匹配后形成一个组,供后面进行使用。可以通过\number的形式进行引用。

    如果要是用这个字面值,可以使用\( \) [(] [)]

    import re
    ret = re.search("(<html>)a\\1","aaaaa<html>a<html>")
    print(ret)
    
  14. (?...) 不创建组

    这种格式的表达式不会创建组,比如(?:hello)

    但是(?P<name>...),这种是创建一个命名组。

本文由【鬼上身跳不过门槛】发布于开源中国,原文链接:https://my.oschina.net/u/3695598/blog/3136567

全部评论: 0

    我有话说: