python_learning_15 正则表达式

import re
# re.match(正则表达式,需要处理的字符串)

例如:
单个字符:
(1)
ret = re.match(r"hello", “hello world”)
ret.group()

ret = re.match(r"Hello", “hello world”, re.I) # 忽略大小写
ret.group()

(2)
ret = re.match(r"速度与激情\d", “速度与激情1”)
ret.group()

ret = re.match(r"速度与激情[1-9]", “速度与激情9”)
ret.group()

(3)
ret = re.match(r"速度与激情\w", “速度与激情哈”)
ret.group()

ret = re.match(r"速度与激情\w", “速度与激情哈”, re.A) # 不支持中文
ret.group()

(4)
ret = re.match(r"速度与激情.", “速度与激情_”)
ret.group()

多个字符:
(1)
ret = re.match(r"速度与激情\d{1,2}", “速度与激情17”)
ret.group()

ret = re.match(r"{11}", “12345678901”)
ret.group()

(2)
ret = re.match(r"021-?\d{1,2}", “021-12345678”) # ? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有
ret.group()

ret = re.match(r"\d{3,4}-?\d{7,8}", “021-12345678”)
ret.group()

ret = re.match(r"\d{5,}", “123456789”)
ret.group()

(3)
html_content = “”“fdsf
sadsad
asdasdsadasd
d”""
ret = re.match(r".*", html_conent, re.S) # * 匹配前一个字符出现0次或者无限次,即可有可无
ret.group()

ret = re.match(r".+", “”, re.S) # + 匹配前一个字符出现1次或者无限次,即至少有1次
ret.group()

例如:
邮箱1:

import re


def main():
    email = input("请输入一个邮箱地址:")
    # 如果在正则表达式中需要用到了某些普通的字符,比如.比如?等,仅仅需要在他们前面添加一个 反斜杠 \ 进行转义
    ret = re.match(r"[a-zA-Z_0-9]{4,20}@163\.com$", email)
    if ret:
        print("%s符合要求---" % email)
    else:
        print("%s不符合要求---" % email)


if __name__=="__main__":
    main()

邮箱2:

import re

"""
要求:
需以字母开头
可使用子母、数字、下划线,6-18个字符
"""

"""
要用的:

如果在正则表达式中需要用到了某些普通的字符,比如.比如?等,仅仅需要在他们前面添加一个 反斜杠 \ 进行转义
[ ]    匹配[ ]中列举的字符
 +     匹配前一个字符出现1次或者无限次,即至少有1次
{m,n}  匹配前一个字符出现从m到n次
 ^     匹配字符串开头
 $     匹配字符串结尾
"""


def main():
    email = input("请输入你要注册的邮箱:")
    ret = re.match(r"^[a-zA-Z][a-zA-Z0-9_]{5,17}\@[a-zA-Z0-9]+\.[a-zA-Z]+$", email)
    if ret:
        print("%s 符合要求" % email)
    else:
        print("%s 不符合要求" % email)


if __name__ == '__main__':
    main()

(4)
| 匹配左右任意一个表达式
(ab) 将括号中字符作为一个分组

ret = re.match(r"[a-zA-Z_0-9]{4,20}@(163|126).com$",“laowang@163.com”)
ret.group(1)

ret = re.match(r"[a-zA-Z_0-9]{4,20}@(163|126).com$",“laowang@163.com”)
ret.group(2)

ret = re.match(r"[a-zA-Z_0-9]{4,20}@(163|126).com$",“laowang@163.com”)
ret.groups()

match
注意:
(1)python中的match默认是从头开始判断的,所以在match中国可以不写^,但是match不会判断结尾,所以当需要以xxx结尾的时候,还需要写上$
匹配单个字符

(2)如果在正则表达式中需要用到了某些普通的字符,比如 .比如?等,仅仅需要在他们前面添加一个 反斜杠 \ 进行 转义

在上一小节中,了解到通过re模块能够完成使用正则表达式来匹配字符串
本小节,将要讲解正则表达式的单字符匹配

字符 功能
. 匹配任意1个字符(除了\n)
[ ] 匹配[ ]中列举的字符
\d 匹配数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即 空格,tab键
\S 匹配非空白
\w 匹配单词字符,即a-z、A-Z、0-9、_、中文
\W 匹配非单词字符
匹配多个字符
匹配多个字符的相关格式

字符 功能

  • 匹配前一个字符出现0次或者无限次,即可有可无
  • 匹配前一个字符出现1次或者无限次,即至少有1次
    ? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有
    {m} 匹配前一个字符出现m次
    {m,n} 匹配前一个字符出现从m到n次
    匹配开头结尾
    字符 功能
    ^ 匹配字符串开头
    $ 匹配字符串结尾
    匹配分组

字符 功能
| 匹配左右任意一个表达式
(ab) 将括号中字符作为一个分组
\num 引用分组num匹配到的字符串
(?P) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串

--------------------------------------------------------------------------------------------------------

re模块的高级用法

search

findall

sub 将匹配到的数据进行替换

split 根据匹配进行切割字符串,并返回一个列表

python贪婪和非贪婪
Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;
非贪婪则相反,总是尝试匹配尽可能少的字符。
在"*","?","+","{m,n}"后面加上?,使贪婪变成非贪婪

则表达式模式中使用到通配字,那它在从左到右的顺序求值时,会尽量“抓取”满足匹配最长字符串,在我们上面的例子里面,“.+”会从字符串的启始处抓取满足模式的最长字符,其中包括我们想得到的第一个整型字段的中的大部分,“\d+”只需一位字符就可以匹配,所以它匹配了数字“4”,而“.+”则匹配了从字符串起始到这个第一位数字4之前的所有字符。
解决方式:非贪婪操作符“?”,这个操作符可以用在"*","+","?"的后面,要求正则匹配的越少越好

非贪婪:
+?
*?
??
{1,3}?

r的作用
说明
Python中字符串前面加上 r 表示原生字符串,
与大多数编程语言相同,正则表达式里使用"“作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符”",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。

Python里的原生字符串很好地解决了这个问题,有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值