defisPhoneNumber(text):iflen(text)!=11:returnFalsefor i inrange(0,len(text)):if(i ==3or i ==7)and text[i]!="-":returnFalseelif i !=3and i !=7andnot text[i].isdecimal():returnFalsereturnTrue
text ="123-456-789"print(text)print(isPhoneNumber(text))
2. 用正则表达式来查找文本模式
2.1 创建正则表达式(Regex)对象
import re
text = re.compile(r'\d\d\d-\d\d\d-\d\d\d')
2.2 匹配Regex对象
import re
text = re.compile(r'\d\d\d-\d\d\d-\d\d\d')match= text.search("~~~123-456-789~~~")print(match.group())
3. 用正则表达式匹配更多模式
3.1 利用括号分组
import re
text = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d)')match= text.search("~~~123-456-789~~~")print(match.group(1))# 123print(match.group(2))# 456-789print(match.groups())# ('123', '456-789')
3.2 用管道匹配多个分组
| :管道
import re
text = re.compile(r'456|123')match= text.search("123-456-789")print(match.group())# 123
3.3 用问号实现可选匹配
import re
text = re.compile(r'\d\d\d(~)?\d\d\d')match= text.search("123123")print(match.group())# 123123match= text.search("123~123")print(match.group())# 123~123
3.4 用星号匹配零次或多次
import re
text = re.compile(r'\d\d\d(~)*\d\d\d')match= text.search("123123")print(match.group())# 123123match= text.search("123~~~123")print(match.group())# 123~~~123
3.5 用加号匹配一次或多次
import re
text = re.compile(r'\d\d\d(~)+\d\d\d')match= text.search("123~123")print(match.group())# 123~123match= text.search("123~~~123")print(match.group())# 123~~~123
3.6 用花括号匹配特定次数
import re
text = re.compile(r'\d\d\d(~){3,5}\d\d\d')match= text.search("123~~~123")print(match.group())# 123~~~123match= text.search("123~~~~~123")print(match.group())# 123~~~~~123
4. 贪心和非贪心匹配
贪心匹配:尽可能匹配最长的字符串
非贪心匹配:尽可能匹配最短的字符串
import re
text = re.compile(r'(123 ){2,4}')match= text.search("123 123 123 123 123 ")print(match.group())# 123 123 123 123
text = re.compile(r'(123 ){2,4}?')match= text.search("123 123 123 123 123 ")print(match.group())# 123 123
5. findall() 方法
import re
text = re.compile(r'\d\d\d-\d\d\d-\d\d\d')match= text.search("~~~123-456-789~~~111-222-333~~~")print(match.group())# 123-456-789match= text.findall("~~~123-456-789~~~111-222-333~~~")print(match)# ['123-456-789', '111-222-333']
6. 字符分类
编写字符分类
表示
\d
0~9的任何数字
\D
除0~9的数字以外的任何字符
\w
任何字母、数字和下划线字符
\W
除字母、数字和下划线以外的任何字符
\s
空格、制表符或换行符
\S
除空格、制表符和换行符以外的任何字符
7. 建立自己的字符分类
import re
text = re.compile(r'[0-5]')match= text.findall("1a2b3c4d")print(match)# ['1', '2', '3', '4']
text = re.compile(r'[abc]')match= text.findall("1a2b3c4d")print(match)# ['a', 'b', 'c']
text = re.compile(r'[^abc]')match= text.findall("1a2b3c4d")print(match)# ['1', '2', '3', '4', 'd']
8. 插入字符和美元字符
^ :以指定文本开始
$ :以指定文本结束
import re
text = re.compile(r'^\d\d\d')match= text.search("123abc456")print(match)# <re.Match object; span=(0, 3), match='123'>
text = re.compile(r'\d\d\d$')match= text.search("123abc456")print(match)# <re.Match object; span=(6, 9), match='456'>
9. 通配字符
. :匹配换行符之外的所有字符
import re
text = re.compile(r'..23')match= text.findall("123abc23")print(match)# ['bc23']
9.1 用点-星匹配所有字符
import re
text = re.compile(r'123(.*)456(.*)')match= text.findall("123abc456def")print(match)# [('abc', 'def')]
9.2 用句点字符匹配换行符
re.DOTALL :让句点字符匹配所有字符(包括换行符)
import re
text = re.compile(r'.*')match= text.search("123abc\n456def")print(match.group())# 123abc
text = re.compile(r'.*', re.DOTALL)match= text.search("123abc\n456def")print(match.group())# 123abc\n456def
10. 不区分大小写的匹配
re.I :不区分大小写
import re
text = re.compile(r'abc', re.I)match= text.findall("abcABC")print(match)# ['abc', 'ABC']
11. 用 sub() 方法替换字符串
import re
text = re.compile(r'ABC\w*')match= text.sub("abc","ABC : 123")print(match)# abc : 123