【Python從入門到精通】二、核心編程:5.正則表達式

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
# regular expression
import re

# 一、re初級用法
ret = re.match('www', 'www.baidu.com.wwww')
print(ret)
print(ret.group())  # <re.Match object; span=(0, 3), match='www'>    www

# 1 .  匹配任意一個字符
print(re.match('.', 'ab').group())

# 2 [] 匹配[]中列舉的字符
print(re.match('[b]', 'bacdefg').group())

# 3 . 匹配除換行符以外的任意字符
#  \w 匹配字母或數字或下劃線或漢字 等價於 '[^A-Za-z0-9_]'。
#  \s 匹配任意的空白符
#  \S 匹配任意的字母
#  \d 匹配數字
#  \b 匹配單詞的開始或結束
#  ^ 匹配字符串的開始
#  $ 匹配字符串的結束
#  \w能不能匹配漢字要視你的操作系統和你的應用環境而定
print(re.match("嫦娥一號", "嫦娥一號升空了").group())
print(re.match("嫦娥\d號", "嫦娥1號升空了").group())
print(re.match("嫦娥\S號", "嫦娥一號升空了").group())

# 4 字符串前加 r 表示原生字符串 解除轉義字符的困擾
mm = "c:\\a\\b\\c"
print(mm)  # c:\a\b\c
print(re.match("c:\\\\a", mm).group())  # c:\a
print(re.match(r"c:\\a", mm).group())  # c:\a

# 5 表示數量
'''
* 匹配前一個字符出現 0-n次
+ 匹配前一個字符出現 1-n次
? 匹配前一個字符出現 0-1次
{m}  匹配前一個字符出現m次
{m,} 匹配前一個字符出現至少m次
{m,n}匹配前一個字符出現m-n次
'''
# 5.1 匹配第一個字符爲大寫字符 第二個字符爲小寫字符 且小寫字符可有可無(*)
print(re.match('[A-Z][a-z]*', 'AbsdasdDsadsa').group())  # Absdasd
# 5.2 匹配變量名是否合法
print(re.match("[A-Za-z_]+[\w_]*", "name_").group())
print(re.match("[A-Za-z_]+[\w_]*", "_name1").group())
# print(re.match("[A-Za-z_]+[\w_]*","1name").group())
# 5.3 匹配出 0-99之間的數字(?)
print(re.match("[1-9]?[0-9]", "88").group())
print(re.match("[1-9]?[0-9]", "8").group())
# 5.4 匹配出8-20位的密碼 密碼可以是字符數字下劃線({m})
print(re.match("[A-Za-z0-9_]{8,20}", "zhao123321").group())
# 練習 匹配出163的郵箱地址,且@符號前有4-20位
print(re.match("[A-Za-z0-9]{4,20}@163\.[\w]*", "[email protected]").group())

# 6 表示邊界 ^ 匹配字符串開頭 $ 匹配字符串結尾 \b 匹配一個單詞的邊界 \B 匹配非單詞邊界
print(re.match("[A-Za-z0-9]{4,20}@163\.com$", "[email protected]").group())
print(re.match(r".*\bver\b", "ho ver abc").group())  # ho ver
# print(re.match(r".*\bver\b","hover abc").group())
print(re.match(r".*\Bver\B", "hoverabc").group())  # hover
# print(re.match(r".*\Bver\B","ho verabc").group())

# 7、匹配分組
# | 匹配左右任意一個表達式  (ab) 將括號中字符作爲一個分組
# \num 引用分組num匹配到的字符  (?P<name>) 分組起別名
# (?P=name) 引用別名爲name分組匹配到的字符串
print(re.match("[1-9]?\d$|100", "100").group())
print(re.match("\w{4,20}@(126|163|qq).com$", "[email protected]").group())
# 7.1 匹配 區號-電話號碼
print(re.match("([^-]+)-(\d+)", "123424-223423").group(0))
# 7.2 引用分組num
print(re.match("<[A-Za-z]+>\w*</[A-Za-z]+>", "<html>sdsd</htmlaaa>").group())
print(re.match(r"<([A-Za-z]+)>\w*</(\1)>", "<html>sdsd</html>").group())
print(re.match(r"<([A-Za-z0-9]+)><([A-Za-z0-9]+)>.*</\2></\1>", "<html><h1>www.baidu.com</h1></html>").group())
# 7.3 (?P<name>) (?P=name)
print(re.match(r"<(?P<name1>[A-Za-z0-9]+)><(?P<name2>[A-Za-z0-9]+)>.*</(?P=name2)></(?P=name1)>", "<html><h1>"
                                                                                                  "www.baidu.com</h1></html>").group())
# 100
# [email protected]
# 123424-223423
# <html>sdsd</htmlaaa>
# <html>sdsd</html>
# <html><h1>www.baidu.com</h1></html>
# <html><h1>www.baidu.com</h1></html>

# 二、re高級用法
# 1、search  匹配出人口數
print(re.search("\d+", "全球人口爲70億人").group())
# 2、findAll 匹配不同國家人口
print(re.findall("\d+", "中國14億,美國4億,日本2億"))
# 3、sub將匹配到的數據進行替換
print(re.sub("\d+", "15", "中國14億,美國4億,日本2億", 1))
    # 通過函數回調 匹配並計算值返回
def add(temp):
    num = temp.group()
    return str(int(num) + 1)
print(re.sub(r"\d+", add, "python 99"))
    # 70
    # ['14', '4', '2']
    # 中國15億,美國4億,日本2億
    # python 100

# 4、split切割值
print(re.split(":|: | ","hello:world welcome"))
# ['hello', 'world', 'welcome']


# 三、練習
# 提取url
dy_url = "<img data-original=\"https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg\" " \
         "src=\"https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg\" style=\"display: inline;\">"
list = re.findall("(http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*,]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)|"
                 "([a-zA-Z]+.\w+\.+[a-zA-Z0-9\/_]+)",dy_url)
print(list[0][0])
print(list[1][0])

# 找到單詞
print(re.split(" ","we are the world"))

# 過濾網址

print(re.match("^http:.*[asp$]","http://www.interoem.com/messageinfo.asp?id=35").group())
print(re.match("^http:\S+.com","http://3995503.com/class/class09/news_show.asp?id=14").group())
# https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg
# https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg
# ['we', 'are', 'the', 'world']
# http://www.interoem.com/messageinfo.asp
# http://3995503.com
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章