cuiqingcai大佬《Python3 网络爬虫开发实战》整理
贪婪与非贪婪
import re content = 'Hello 12345678 Word_This is a Regex Demo' result = re.match('^He.*(d+).*Demo$', content) print(result.group(1))
原本打算取出12345678,但
运行结果:8
贪婪匹配模式:.* 会匹配尽可能多的字符。
.*后(d+)至少匹配一个数字,未指定具体数字。因此,.*尽可能匹配多的字符,把1234567匹配,给d+留下一个仅满足条件的结果8。
so,最后结果就至于8了。
非贪婪模式匹配:.*? 尽可能匹配少的字符,余下交给后面的去匹配。
在.*后加一个?
import re content = 'Hello 12345678 World_This is a Regex Demo' result = re.match('^He.*?(d+).*Demo$', content) print(result.group(1))
运行结果:12345678
所以,匹配时,字符中间尽量用非贪婪匹配,以免出现匹配结果确实的情况。若是匹配结果在字符串结果,.*?有可能匹配不到任何内容,因为它会匹配尽可能少的字符。
import re content = 'http://weibo.com/comment/kEraCN' result1 = re.match('^h.*?comment/(.*?)', content) result2 = re.match('^h.*?comment/(.*)', content) print('result1', result1.group(1)) print('result2', result2.group(2))
修饰符
修饰符 |
描述 |
re.I |
使匹配对大小写不敏感 |
re.L | 做本地化识别(local-aware)匹配 |
re.M | 多行匹配,影响^和$ |
re.S | 使.匹配包括换行符在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响w、W、和B |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解 |
转义匹配
match() 从字符串的开头开始匹配,若开头不匹配,整个匹配失败。更适合用来检测某个字符串是否符合某个正则表达式的规则。
search() 搜索整个字符串,然后返回第一个成功匹配的结果。
findall() 搜索整个字符串,然后返回匹配正则表达式的所有内容。
sub() 修改文本
sub('参数1', '参数2', content)
参数1传入修改匹配的表达式,参数2替换内容.
经过sub()处理后在用XX方法匹配,效果可能会更好。
compile() 将正则表达式编译成对象,后面匹配可复用。
compile()中可传入修饰符,这样在search()、findall()方法中就不需额外再传了。