python 正则表达式初探

1. 基本使用
import re
match(r"正则", 数据) 从头开始匹配 如果匹配失败就直接终止匹配
匹配成功 返回含有匹配结果的 对象  .group()
匹配失败 返回None
re.match(r"ah", "ahelloworld").group()
re.match(r"hello", "ahelloworld").group()
search(r"正则", 数据) 从头开始搜索 并且尝试匹配 如果匹配失败就继续往后搜索
匹配成功 返回含有匹配结果的 对象  .group()
匹配失败 返回None
re.search(r"ah", "ahelloworld").group()
re.search(r"hello", "ahelloworld").group()


2. 匹配单个字符
. 匹配除\n之外的一个任意字符
re.search(r"hello.", "helloworld").group()
re.search(r"hello.", "hello2").group()
re.search(r"hello.", "hello\n").group()
[] 匹配集合内的任意一个字符
re.search(r"hello[ab]", "helloa").group()
re.search(r"hello[ab]", "hellob").group()
re.search(r"hello[ab]", "helloc").group()
re.search(r"hello[0123456789]", "hello1").group()
re.search(r"hello[0123456789]", "helloq").group()
[-] 匹配范围内的任意一个字符 [a-z] [A-Z] [0-9]
re.search(r"hello[0-9]", "helloq").group()
re.search(r"hello[0-9]", "hello0").group()
re.search(r"hello[a-z]", "hello0").group()
re.search(r"hello[a-z]", "hellox").group()
re.search(r"hello[a-z]", "helloY").group()
re.search(r"[A-Z]ello", "hello").group()
[^] 禁止匹配范围内的任意一个字符 [^a-z] -取反
re.search(r"Hello[^0-9]", "Hello1").group()
re.search(r"Hello[^0-9]", "Helloa").group()
\d 匹配一个数字[0-9]  \D匹配一个非数字[^0-9]
re.search(r"hello\d", "hello0").group()
re.search(r"hello\d", "hello9").group()
re.search(r"hello\d", "helloa").group()
re.search(r"神舟\d号升空了", "神舟1号升空了").group()
re.search(r"神舟\d号升空了", "神舟a号升空了").group()
\s space空白字符[ \r\n\t\v\f]    \S [^ \r\n\t\v\f] 
re.search(r"神舟\s号升空了", "神舟 号升空了").group()
re.search(r"神舟\s号升空了", "神舟\t号升空了").group()
\w word 等价 [a-zA-Z0-9_] \W 等价 [^a-zA-Z0-9_]
re.search(r"神舟\w号升空了", "神舟1号升空了").group()
re.search(r"神舟\w号升空了", "神舟A号升空了").group()
re.search(r"神舟\w号升空了", "神舟_号升空了").group()
re.search(r"神舟\W号升空了", "神舟_号升空了").group()
re.search(r"神舟\W号升空了", "神舟1号升空了").group()
In [43]: re.search(r"神舟\W号升空了", "神舟A号升空了").group()
In [44]: re.search(r"神舟\W号升空了", "神舟@号升空了").group()
拓展 \w 
py2 默认模式 ASCII模式[a-zA-Z0-9_]
py3        UNICODE  [a-zA-Z0-9_] + 汉字
如果需要改变默认的 匹配模式 就可以在最后的参数 re.A 或者 re.U


3. 匹配多次 
\d{m}  匹配m次数字字符 = {m,m}
In [48]: re.search(r"神舟\d\d号升空了", "神舟10号升空了",re.A).group()
In [49]: re.search(r"神舟\d\d\d\d\d号升空了", "神舟10000号升空了",re.A).group()
In [50]: re.search(r"神舟\d{5}号升空了", "神舟10000号升空了",re.A).group()
In [51]: re.search(r"神舟\d{10}号升空了", "神舟1000000000号升空了",re.A).group()
{n,m}  匹配至少n次 至多m次
{n,} 匹配至少n次 
In [52]: re.search(r"神舟\d{1,10}号升空了", "神舟1号升空了",re.A).group()
In [53]: re.search(r"神舟\d{1,10}号升空了", "神舟100000号升空了",re.A).group()
In [54]: re.match(r"\d{3,4}-\d{6,8}","021-12345678").group()
In [55]: re.match(r"\d{3,4}-\d{6,8}","0755-1234567").group()
+      匹配至少1次  {1,}
In [56]: re.search(r"神舟\d{1,}号升空了", "神舟100000号升空了",re.A).group()
In [57]: re.search(r"神舟\d{1,}号升空了", "神舟1000000000000000000号升空了",re.A).group()
In [58]: re.search(r"神舟\d+号升空了", "神舟1000000000000000000号升空了",re.A).group()
*      匹配至少0次  匹配任意多次 {0,}
In [59]: re.search(r"神舟\d{0,}号升空了", "神舟号升空了",re.A).group()
In [60]: re.search(r"神舟\d{0,}号升空了", "神舟11111号升空了",re.A).group()
In [61]: re.search(r"神舟\d*号升空了", "神舟11111号升空了",re.A).group()
In [62]: re.search(r"神舟\d*号升空了", "神舟号升空了",re.A).group()
?      匹配0次或者1次  {0,1}
In [63]: re.search(r"神舟\d{0,1}号升空了", "神舟号升空了",re.A).group()
In [64]: re.search(r"神舟\d{0,1}号升空了", "神舟1号升空了",re.A).group()
In [65]: re.search(r"神舟\d?号升空了", "神舟1号升空了",re.A).group()
In [66]: re.search(r"神舟\d?号升空了", "神舟号升空了",re.A).group()
4. 匹配位置
^ 匹配开始位置
$ 匹配结束位置
In [79]: re.match(r"\w{4,20}@163.com","123456@163.com").group()
In [80]: re.match(r"\w{4,20}@163.com","123456@163Acom").group()
In [81]: re.match(r"\w{4,20}@163\.com","123456@163.com").group()
In [82]: re.match(r"\w{4,20}@163\.com","123456@163Acom").group()
In [83]: re.match(r"\w{4,20}@163\.com","123456@163.com.cc").group()
In [84]: re.match(r"\w{4,20}@163\.com","cc.123456@163.com.cc").group()
In [85]: re.search(r"\w{4,20}@163\.com","cc.123456@163.com.cc").group()
In [86]: re.search(r"^\w{4,20}@163\.com$","cc.123456@163.com.cc").group()
In [87]: re.search(r"^\w{4,20}@163\.com$","123456@163.com.cc").group()
In [88]: re.search(r"^\w{4,20}@163\.com$","123456@163.com").group()
In [90]: re.match(r"^\w{4,20}@163\.com$","cc.123456@163.com").group()


5. 分组-匿名
| 匹配左边或者右边的正则表达式
(b|a) 匹配 在分组括号内 左边或者右边的正则表达式
目的: 将感兴趣的数据从整理提取到某个位置
创建:
(正则)
获取分组结果:
.group() == .group(0) 获取到的正则表达式 整体匹配到的结果
.group(编号) 用户的分组从下标1开始
引用分组
目的: 将前面正则匹配到的数据 用在后续某个位置 进行匹配
形式: \分组编号 
In [96]: re.match(r"(\d{3,4})-(\d{6,8})","021-12345678").group(1)
In [97]: re.match(r"(\d{3,4})-(\d{6,8})","021-12345678").group(2)
In [98]: re.match(r"(\d{3,4})-(\d{6,8})","021-12345678").group(0)
In [99]: re.match(r"(\d{3,4})-(\d{6,8}) \1-\2","021-12345678 021-12345678").group(0)
In [100]: re.match(r"(\d{3,4})-(\d{6,8}) \1-\2","021-12345678 021-12345678").group(1)
In [101]: re.match(r"(\d{3,4})-(\d{6,8}) \1-\2","021-12345678 021-12345678").group(2)
In [102]: re.match(r"(\d{3,4})-(\d{6,8}) \1-\2","021-12345678 021-1234567").group(2)
6. 分组-有名分组
优点: 分组编号发送变化会影响匿名分组  
创建有名:
(?P<分组名>正则)
获取分组结果
.group(分组编号) == .group(分组名字)
引用
(?P=分组名字) 
In [108]: re.match(r"((\d{3,4})-(\d{6,8}))","021-12345678 021-12345678").group()
In [110]: re.match(r"((\d{3,4})-(\d{6,8}))","021-12345678 021-12345678").group(1)
In [111]: re.match(r"((\d{3,4})-(\d{6,8}))","021-12345678 021-12345678").group(3)
In [112]: re.match(r"((\d{3,4})-(\d{6,8}))","021-12345678 021-12345678").group(2)
In [114]: re.match(r"((\d{3,4})-(\d{6,8})) \2-\3","021-12345678 021-12345678").group(3)
re.match(r"(?P<quhao>\d{3,4})-(?P<zuoji>\d{6,8}) (?P=quhao)-(?P=zuoji)","021-12345678 021-12345678)
In [116]: re.match(r"(?P<quhao>\d{3,4})-(?P<zuoji>\d{6,8}) (?P=quhao)-(?P=zuoji)","021-12345678 021-12345678")
In [117]: re.match(r"(?P<quhao>\d{3,4})-(?P<zuoji>\d{6,8}) (?P=quhao)-(?P=zuoji)","021-12345678 021-12345678")
In [118]: re.match(r"(?P<quhao>\d{3,4})-(?P<zuoji>\d{6,8}) (?P=quhao)-(?P=zuoji)","021-12345678 021-12345678")
In [119]: re.match(r"(?P<quhao>\d{3,4})-(?P<zuoji>\d{6,8}) (?P=quhao)-(?P=zuoji)","021-12345678 021-12345678")

7. re模块常用函数
.findall(正则, 数据) 搜索数据中所有正则规律的数据
返回值是所有匹配正则的数据的列表
.sub(正则, 替换数据, 整体数据,替换次数=-1) 
从整体数据中 查找出符合正则规律的数据  替换为 参数2
返回值就是替换之后的数据
.split(正则, 数据)
把数据 按照正则的规则作为分割条件 进行切割
返回值就是  切割之后的数据构成的列表
8. 贪婪
默认情况下 匹配模式为贪婪模式<越多越好>
懒惰                     《越少越好》  

贪婪模式设置为懒惰模式  + ? * {m,n} 后加 ?
前提: 满足整体匹配结果
9. r字符的作用
用\对数据中的\进行转义   \ ----> \\
数据中如果有\\  正则需要\\\\ == r"\\"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值