分组等
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()
执行结果:
存在的问题:显然第二个匹配的闭合标签和第一个没有关系。那么怎么才能让第二匹配的和第一个一致呢。
解决:用小括号把第一个括起来,第二个处,用编号代替。
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()