1. 程式人生 > >網路爬蟲_re正則表示式

網路爬蟲_re正則表示式

"""正則表示式re

概念
    檢索符合某個規則的字串。
    通用的字串表達框架。
    簡潔表達一組字串。

常用
    表達文字型別的特徵。
    同時查詢或替換一組字串。
    匹配字串全部或部分。"""


# --------------------------------------
"""正則表示式語法

常用操作符
    .    # 表示任何單字元。
    []   # 字符集,對單個字元給出取值範圍。[abc][a-z]
    [^]  # 非字符集。[^abc]除了abc以外的單個字元
    *    # 前一個字元0次或無限次擴充套件。
    +    # 前一個字元1次或無限次擴充套件。
    ?    # 前一個字元0次或1次擴充套件。
    |    # 左右表示式任意一個,等同於或。
    
    {m}  # 擴充套件前一個字元m次,ab{2}c表示abbc。
    {m, n}  # 擴充套件前一個字元m或n,ab{1, 2}c表示abc和abbc。
    ^    # 匹配字串開頭,^abc表示字串abc且在一個字串開頭。
    $    # 匹配字串結尾,abc$表示字串abc且在一個字串結尾。
    ()   # 分組標記,(abc|def)表示abc和def。
    \d   # 數字,等價於[0-9]。
    \w   # 單詞字元,等價於[A-Za-z0-9]。

pattern = r'abc(.*?)abc'  # 匹配到abc和abc之間的部分,不會匹配到abc
pattern = r'abc.*?abc'  # 匹配abc到abc,包括兩端abc六個字元。
    
    
例項
P(Y|YT|YTH|YHTO)?N  # 'PN' 'PYN' 'PYTN' 'PYTHN' 'PYTHON'
PYTHON+  # 'PYTHON' 'PYTHONN' 'PYTHONNN' ... ...
PY[TH]ON  # 'PYTON' 'PYHON'
PY{:3}N  # 'PN' 'PYN' 'PYYN' 'PYYYN'

IP地址
\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}  # 表示四個用.分隔開的三位數。
精確表示
0-99: [1-9]?\d
100-199: 1\d{2}
200-249: 2[0-4]\d
250-255: 25[0-5]
IP: (([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5]).){3}([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])
# {3}重複三個0-255的數字後加'.' 最後加一個0-255的數字。"""



# ----------------------------------------------------
"""re庫主要功能函式
re.search()  # 搜尋第一個匹配正則表示式的物件。
re.match()  # 只在開始位置搜尋匹配物件。
re.findall()  # 搜尋整個字串,返回全部匹配物件, 返回列表型別。
re.split()  # 按匹配結果進行分割,返回列表型別。
re.finditer()  # 搜尋字串,返回第一個匹配結果的迭代型別。
re.sub()  # 替換所有匹配字串,返回替換後的字串。


pattern  # 正則表示式字串,原生字串。
string  # 要匹配的字串。
flags  # 正則表示式使用時的控制標記。

re.search(pattern, string, flags=0)
re.match(pattern, string, flag=0)
re.sub(pattern, repl, string, count=0, flags=0)
repl  # 替換匹配字串的字串。
count  # 替換匹配的最大次數。"""


import re
match = re.search(r'[1-9]\d{5}', 'BIT 100081')
print(match.span())  # (4, 10)匹配到的字元位置
print(match.group())


match1 = re.match('[1-9]\d]{5}', 'BIT 100081')
if match1:  # 如果match1中沒有匹配到元素,輸出None.
    print(match.group())
else:
    print('None')


li = re.findall(r'[1-9]\d{5}', 'BIT 100081 IAS 124565')
print(li)  # findall返回的是一個列表


li1 = re.split(r'[1-9]\d{5}', 'BIT 100081 IAS 124565')
print(li1)  # ['BIT ', ' IAS ', ''] 將匹配到的部分去掉,分割剩下的字串。


r"""(字串前面加r表示使用真實字元,不作轉義。例如\t為真實字元,不作為製表符。)
"."         匹配除換行符以外的字元。
[]          字元集合,匹配中括號中任意一個包含的字元。
[a-z]       匹配任意一個小寫字母。
[A-Z]       匹配任意一個大寫字母。
[0-9]       匹配任意一個數字。
[0-9a-zA-Z] 匹配任意一個大寫字母、小寫字母、數字。
[0-9a-zA-Z_]匹配任意一個大寫字母、小寫字母、數字和下劃線。
[^sam]      匹配除了's', 'a', 'm'這幾個字母外所有字元。
            ^為脫字元,表示不匹配集合中的字元。
\d          相當於[0-9]。
\D          相當於[^0-9]。
\w          相當於[0-1a-zA-Z_]數字字母和下劃線。
\W          相當於[^0-9a-zA-Z_]非數字、字母和下劃線。
\s          [ \f\n\r\t]匹配任意空白字元(空格,換行,回車,換頁,製表)。
\S          [^ \f\n\r\t]匹配任意非空白字元(空格,換行,回車,換頁,製表)。
"""
 
# 匹配多個字元
"""
(xyz)    xyz作為一個整體匹配。
x?       匹配0個或者1個x。
x*       匹配0個或者任意多個x(.*表示匹配0個或者任意多個字元,換行符除外)。
x+       匹配至少一個x
x{n}     匹配n個x
x{n,m}   匹配至少n個至多m個x
x|y      匹配x或者y
"""
 
 
# 註釋: part2
str = " part2 "
# 第2,3個/為轉義字元,表示*作為字串,並不是正則表示式
print(re.findall("/", str))
 
    #### finditer函式 ####
import re
"""
re.finditer函式
格式:finditer(patter, string, flags)
功能:與findall類似,掃描整個字串,返回一個迭代器。
引數:
patter:匹配的正則表示式
string:匹配的字串
flags:標誌位
"""
str = "sam is a good man, sam is a nice man, sam is a very handsome man!"
d = re.finditer(r"(sam)", str)
while True:
    try:
        l = next(d)
        print(l)
    except StopIteration as e:
        break
 
    #### 替換字串 ####
import re
 
"""
字串的替換和修改
sub(pattern, repl, string, count=0, flags=0)
subn(pattern, repl, string, count=0, flags=0)
引數:
    pattern: 正則表示式
    repl: 指定的用來替換的字串
    string: 字串
    count: 最多替換次數
    flags: 標誌位
功能:在目標字串中用正則表示式的規則匹配字串,
    並替換成指定的字串,如果不指定次數則匹配替換全部字元換 
區別:sub返回被替換的字串
    subn返回一個元組,第一個元組為被替換的字串,第二個元組為替換次數
"""
str = "sam is a good man, sam is a nice man, sam is a very handsome man!"
sub = re.sub("sam", "Tom", str, count=2)
subn = re.subn("sam", "Tom", str, count=1)
print(sub)
print(subn)