python王者-第16章正则表达式
📚 正则表达式 Regular Expression
16-1:使用 Python 硬功夫搜寻文字
16-2:正则表达式的基础
导入 re 模块
python
Copy
import re # 导入 re 模块
16-2-1:建立搜寻字符串模式
手机号码格式 xxxx-xxx-xxx 可用下列正规表达方式表示:
表达式:‘\d\d\d\d-\d\d\d-\d\d\d’
注意:字符串放入函数内需增加 \,所以正规表达式应为:
python
Copy
‘\d\d\d\d-\d\d\d-\d\d\d’
使用原始字符串前缀 r 可以避免转义字符被转义:
python
Copy
r’\d\d\d\d-\d\d\d-\d\d\d’
16-2-2:使用 re.compile() 建立 Regex 对象
python
Copy
phoneRule = re.compile(r’\d\d\d\d-\d\d\d-\d\d\d’)
16-2-3:搜寻对象
python
Copy
phoneNum = phoneRule.search(msg) # msg 是欲搜寻的字符串
16-2-4:findall()
python
Copy
phoneNum = phoneRule.findall(string)
16-2-5:再看 re 模块
方法:
re.search(pattern, string, flags)
re.findall(pattern, string, flags)
16-2-6:再看正则表达式
可以简化重复的表达:
python
Copy
r’\d{4}-\d{3}-\d{3}’
16-3:更多搜寻比对模式
例如:02-28350000 可用 xx-xxxxxxxx 表达。
16-3-1:使用小括号分组
python
Copy
r’(\d{2})-(\d{8})’ # 用小括号隔开群组
16-3-2:groups()
16-3-3:区域号码是在小括号内
处理小括号时,使用 ( 和 )。
16-3-4:使用管道 |
管道符号在正规表示法中用于同时搜寻多个字符串。
16-3-5:多个分组的管道搜寻
python
Copy
pattern = r’John(son|nason|nathan)’
16-3-6:使用 ? 问号做搜寻
问号表示括号内的字符串可有可无:
python
Copy
(na)? # na 字符串可有可无
16-3-7:使用 * 号做搜寻
星号表示括号内的字符串可以从 0 到多次:
python
Copy
(na)* # na 字符串可从 0 到多次
16-3-8:使用 + 号做搜寻
加号表示括号内的字符串可以从 1 到多次:
python
Copy
(na)+ # na 字符串可从 1 到多次
16-3-9:搜寻时忽略大小写
在 search() 或 findall() 方法中增加第三个参数 re.I 或 re.IGNORECASE,可以忽略大小写。
16-4:贪婪与非贪婪搜寻
16-4-1:搜寻时使用大括号设定比对次数
python
Copy
(son){3} # 搜寻的字符串是 ‘sonsonson’
(son){3,5} # 可以是 ‘sonsonson’、‘sonsonsonson’ 或 ‘sonsonsonsonson’
16-4-2:贪婪与非贪婪搜寻
16-5:正则表达式的特殊字符
16-5-1:特殊字符表
16-5-2:字符分类
a−za-za−z:代表 a-z 的小写字符。
A−ZA-ZA−Z:代表 A-Z 的大写字符。
[aeiouAEIOU]:代表英文发音的元音字符。
2−52-52−5:代表 2-5 的数字。
16-5-3:字符分类的 ^ 字符
中括号内的左方加上 ^ 字符,表示搜寻不在这些字符内的所有字符。
16-5-4:正规表示法的 ^ 字符
在正规表示法中,起始位置加上 ^ 字符表示字符串必须出现在被搜寻字符串的起始位置。
16-5-5:正规表示法的 $ 字符
16-5-6:单一字符使用通配符 .
通配符 . 表示可以搜寻除了换行字符以外的所有字符,但仅限于一个字符。
16-5-7:所有字符使用通配符 .*
组合 . 与 * 可以搜寻所有字符,表示搜寻 0 到多个字符(换行字符除外)。
16-5-8:换行字符的处理
16-6:MatchObject 物件
16-6-1:re.match()
与 re.search() 类似,但 re.match() 只搜寻比对字符串开始的字,失败则算失败。
16-6-2:MatchObject 几个重要的方法
16-7:抢救 CIA 情报员 - sub() 方法
16-7-1:一般的应用
python
Copy
result = re.sub(pattern, newstr, msg) # msg 是整个欲处理的字符串或句子
16-8:处理比较复杂的正则表示法
16-8-1:将正则表达式拆成多行字符串
16-8-2:re.VERBOSE
使用 Python 时,加上注释需要配合使用 re.VERBOSE 参数。
16-8-3:电子邮件地址的搜寻
16-8-4:re.IGNORECASE/re.DOTALL/re.VERBOSE
可以使用管道 | 方式放置多个参数特性:
python
Copy
datastr = re.search(pattern, msg, re.IGNORECASE | re.DOTALL | re.VERBO