二、万能匹配符号

.(点)可以匹配任意字符(除换行符),*(星) 又代表匹配前面的字符无限次,所以它们组合在一起 .* 就可以匹配任意的字符了,有了它我们就不用挨个字符地匹配了。

贪婪匹配: .* 可以匹配任意多的字符,在正常它会尽量多地匹配字符,如下实例:

import re content = 'Hello 1234567 World_This is a Regex Demo' result = re.match( '^He.*(\d+).*Demo$' , content) print(result.group(1)) # 结果是 7 #匹配式'^He.*(\d+).*Demo$' 中.*(贪婪匹配)可以尽量多地匹配到llo 123456 而正则式仍成立的 复制代码

**非贪婪的匹配:**这时要想得到一个非贪婪的匹配,可以得到1234567,可以用 .*? 为非贪婪匹配模式。实例如下:

import re content = 'Hello 1234567 World_This is a Regex Demo' result = re.match( '^He.*?(\d+).*Demo$' , content) print(result.group(1)) # 结果是 1234567 复制代码

贪婪匹配是尽可能匹配多的字符,非贪婪匹配就是尽可能匹配少的字符 .*? 之后是 \d+ 用来匹配数字,当 .*? 匹配到 Hello 后面的空白字符的时候,再往后的字符就是数字了,而 \d+ 恰好可以匹配,那么这里 .*? 就不再进行匹配,交给 \d+ 去匹配后面的数字。所以 .*? 匹配了尽可能少的字符,\d+ 的结果就是 1234567 。

三、修饰符

修饰符 描述 re .I 使匹配对大小写不敏感 re .L 做本地化识别(locale-aware)匹配 re .M 多行匹配,影响 ^ 和 $ re .S 使 . 匹配包括换行在内的所有字符 re .U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \ b , \ B . re .X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 在网页匹配中较为常用的为 re .S 、re .I 复制代码

实例:

import re content = '''Hello 1234567 World_This is a Regex Demo result = re.match( '^He.*?(\d+).*?Demo$' , content) print(result.group(1)) #运行结果:AttributeError: 'NoneType' object has no attribute 'group',没有捕获括号内的值 复制代码

因为需求匹配的文本content有换行符(有换行),而 . 匹配的是换行符以外的任意字符,故匹配失败。那么在这里我们只需要加一个修饰符 re.S,即可修正这个错误。

result = re.match( '^He.*?(\d+).*?Demo$' , content, re.S) #运行结果:1234567 #在 match() 方法的第三个参数传入 re.S,它的作用是使 . 匹配包括换行符在内的所有字符。 复制代码

四、re库函数

  • re.match():从字符串的开头开始匹配,匹配到相符的;
  • import re content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings' result = re.match( 'Hello.*?(\d+).*?Demo' , content) print(result) #运行结果 None
  • re.search():匹配时会扫描整个字符串,然后返回第一个成功匹配的结果;
  • import re content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings' result = re.search( 'Hello.*?(\d+).*?Demo' , content) print(result) #运行结果 <_sre.SRE_Match object; span=(13, 53), match='Hello 1234567 World_This is a Regex Demo'>

    re.findall():匹配时会扫描整个字符串,然后返回匹配正则表达式的所有内容;

    re.sub():匹配到整个字符串符合的内容,并做替换;

    import re content = '54aK54yr5oiR54ix5L2g' content = re.sub( '\d+' , '' , content) print(content) #结果:aKyroiRixLg #re.sub(‘正则式’,‘替换内容’,验证的文本)
  • re.compile():将正则字符串编译成正则表达式对象,以便于在后面的匹配中复用;
  • import re content1 = '2016-12-15 12:00' content2 = '2016-12-17 12:55' content3 = '2016-12-22 13:21' pattern = re.compile( '\d{2}:\d{2}' ) result1 = re.sub(pattern, '' , content1) result2 = re.sub(pattern, '' , content2) result3 = re.sub(pattern, '' , content3) print(result1, result2, result3) #运行结果:2016-12-15  2016-12-17  2016-12-22 #将正则字符串编译成正则表达式对象pattern,后面直接调用pattern 复制代码

    参考资料:

    正则表达式: [ germey.gitbooks.io/python3webs… ]