分组等

1.

    | : 表示或

示例(小括号的第一种用法,限制|的范围):

# 匹配出163的邮箱地址,且@符合之前有4到20位,例如hello@163.com
# 扩展,不止匹配163的邮箱,比如还要匹配126的邮箱
import re


def main(mail_addr):
    # ret = re.match(r"[a-zA-Z0-9]{4,20}@163\.com$", mail_addr)
    ret = re.match(r"[a-zA-Z0-9]{4,20}@163|126\.com$", mail_addr) # 则 | 前面的或者后面的匹配都可以
    # 一般要先判断ret有没有值
    print(ret.group())


if __name__ == "__main__":
    mail_addr = input("请输入一个要判断的邮箱地址:")
    main(mail_addr)

当输入为hello@163.com,输出为hello@163,原因:因为已经符合|前面的匹配规则。
当输入为126.com,输出为126.com,原因:因为符合|后面的匹配规则。

故正确的写法:

ret = re.match(r"[a-zA-Z0-9]{4,20}@(163|126)\.com$", mail_addr) # 加上小括号,来限制

小括号的第二种用法:在正则表达式匹配成功的前提下,如果想单独取出某一部分数据,则可以把要单独取得的那一部分数据加上小括号。那么在将来正则表达式通过的情况下,可以单独取括号里的值,而不是整体的值。(这种方法就称作分组)

示例代码:

# 匹配出163的邮箱地址,且@符合之前有4到20位,例如hello@163.com
# 扩展,不止匹配163的邮箱,比如还要匹配126的邮箱
import re


def main(mail_addr):
    # ret = re.match(r"[a-zA-Z0-9]{4,20}@163\.com$", mail_addr)
    # ret = re.match(r"[a-zA-Z0-9]{4,20}@163|126\.com$", mail_addr) # 则 | 前面的或者后面的匹配都可以
    ret = re.match(r"[a-zA-Z0-9]{4,20}@(163|126)\.com$", mail_addr) # 则 | 前面的或者后面的匹配都可以
    # 注意:正常情况下要先判断ret是否有值。
    # 1.匹配满足要求(163或162邮箱)的邮箱
    print(ret.group())
    # 2.小括号使用
    #因为此处只有一对小括号,所以当前该小括号的编号是1(小括号对,从前往后编号)
    #则取小括号里的值可以如下写
    # 当地址是hello@126.com
    print(ret.group(1))  # 取得结果为:126

    # 当地址是hello@126.com
    #eg:
    ret = re.match(r"([a-zA-Z0-9]{4,20}@)(163|126)\.com$", mail_addr) # 则 | 前面的或者后面的匹配都可以
    print(ret.group(1))  # 取得结果为:hello@
    print(ret.group(2))  # 取得结果为:126


if __name__ == "__main__":
    mail_addr = input("请输入一个要判断的邮箱地址:")
    main(mail_addr)

2. 判断一串字符串:“<h1>hahah</h1>”是否符合html规范。

import re


def main():
    html_tag = input("请输入一个html语句:")
    ret = re.match(r"<\w*>.*</\w*>", html_tag)
    if ret:
        print(ret.group())


if __name__ == "__main__":
    main()

执行结果:

python校验邮箱格式 python 正则匹配邮箱_数据

存在的问题:显然第二个匹配的闭合标签和第一个没有关系。那么怎么才能让第二匹配的和第一个一致呢。

解决:用小括号把第一个括起来,第二个处,用编号代替。

import re


def main():
    html_tag = input("请输入一个html语句:")
    # ret = re.match(r"<\w*>.*</\w*>", html_tag) # 存在问题,标签闭合处的匹配与标签开始处没有关联。
    # 正确写法
    ret = re.match(r"<(\w*)>.*</\1>", html_tag) 
    if ret:
        print(ret.group())


if __name__ == "__main__":
    main()

补充了解(给小括号里取变量名的方式):

import re


def main():
    html_tag = input("请输入一个html语句:")
    # 匹配有两对html标签的
    # ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", html_tag) 
    # 和上面等价的写法
    ret = re.match(r"<(?P<p1>\w*)><(?P<p2>\w*)>.*</(?P=p2)></(?P=p1)>", html_tag)
    if ret:
        print(ret.group())


if __name__ == "__main__":
    main()