正则表达式(Regular Expression)是对字符串操作的一种逻辑公式。之前的章节我们已经提到过正则表达式,本篇我们就对正则表达式做一个详细的介绍。
re.match
re.match 尝试从字符串的起始位置匹配一个模式,如果匹配不成功,则返回 None。
最常规匹配
| import re
 content = 'Hello 123 4567 Regex Demo'
 result = re.match(r'^Hello\s\d\d\d\s\d{4}\s\w{5}.*Demo$', content)
 print(result)
 
 
 print(result.group())
 
 
 print(result.span())
 
 
 | 
泛匹配
| import re
 content = 'Hello 123 4567 Regex Demo'
 result = re.match(r'^Hello.*Demo$', content)
 print(result)
 
 
 print(result.group())
 
 
 print(result.span())
 
 
 | 
匹配目标
| import re
 content = 'BIT 150001'
 result = re.match(r'1\d{5}', content)
 print(result)
 
 
 print(result.group(0))
 
 
 print(result.group(1))
 
 
 print(result.span())
 
 
 | 
贪婪匹配
| import re
 content = 'PYANBNCN'
 result = re.match(r'PY.*N', content)
 print(result.group())
 
 
 | 
非贪婪匹配
非贪婪匹配可用于的操作符有: 
| import re
 content = 'PYANBNCN'
 result = re.match(r'PY.*?N', content)
 print(result.group())
 
 
 | 
匹配模式
常见的匹配模式有: 
- re.I: 忽略大小写,即 [a-z] 也可以匹配大写字母
- re.M: 当有多行文本,^ 每一行都会进行匹配
- re.S: . 可以忽略换行符进行匹配
| import re
 content = """Hello 1234567
 Regex Demo
 """
 result = re.match(r'He.*?(\d+).*?Demo$', content)
 print(result)
 
 
 result = re.match(r'He.*?(\d+).*?Demo$', content, re.S)
 
 
 | 
转义
我们在使用正则表达式时,最好使用原生字符串: 
| import re
 content = 'price is $5.00'
 result = re.match('price is $5.00', content)
 print(result)
 
 
 result = re.match('price is \$5\.00', content)
 print(result)
 
 
 result = re.match(r'price is $5.00', content)
 print(result)
 
 
 | 
常见示例
| ip_pattern = r'(([1-9]?[0-9]|1\d{2}|2[0-4]\d|25[0-5]).){3}([1-9]?[0-9]|1\d{2}|2[0-4]\d|25[0-5])'
 
 | 
re.search
re.search 会扫描整个字符串并返回第一个成功的匹配。
| import re
 content = 'ABC Hello 1234567 Regex Demo DEF'
 result = re.search(r'He.*?(\d+)\s.*Demo', content)
 print(result)
 
 
 | 
re.findall
re.findall 扫描整个字符串,以列表的形式返回所有匹配的子串。
| html = r'''<html><li>
 <a href="/1.mp3">偏偏喜欢你</a>
 </li>
 <li><a href="/2.mp3">山丘</a></li>
 <li><a href="/3.mp3">领悟</a></li>
 <li><a href="/4.mp3">BUGs</a></li>
 <html>'''
 
 results = re.findall(r'<a\shref="(.*?)">(.*?)</a>', html, re.S)
 print(results)
 
 for result in results:
 print(result[0], result[1])
 
 | 
re.compile
将正则字符串编译成正则表达式对象,便于复用。
| import re
 content = 'ABC Hello 1234567 Regex Demo DEF'
 
 pattern = re.compile(r'Hello.*Demo', re.S)
 result = re.search(pattern, content)
 print(result)
 
 
 |