1. 程式人生 > 其它 >python內建模組之re模組

python內建模組之re模組

在python的內建模組中,re模組是python使用正則表示式提供的模組之一,這模組到底提供了多少操作正則表示式的內建方法呢?點進來看一下吧~

內容概要

  • re模組常用方法

  • findall

  • search

  • match

  • re模組其他方法

  • split

  • sub

  • subn

  • compile

  • finditer

  • findall 對無名分組優先展示

  • re實戰之爬取紅牛分公司資料

內容詳細

re模組常用方法

在python要想使用正則必須藉助於模組,re就是其中之一

1、findall

查詢字串中所有匹配到的字元,並返回一個列表,
沒有匹配資料則返回一個空列表

import re

re.findall('正則表示式','帶匹配的文字')  # 根據正則匹配除所有符合條件的資料
res = re.findall('b','eva jason jackson')
print(res)  # ['a', 'a', 'a']

2、search

查詢字串中的指定的字元,匹配到一個就立刻停止,並返回一個物件,需要用group方法取值

res = re.search('正則表示式','帶匹配的文字')  # 根據正則匹配到一個符合條件的就結束
res = re.search('a','eva jason jackson')
print(res)  # 結果物件
print(res.group())  # 正在的結果
if res:
    print(res.group())
else:
    print('不好意思 沒有找到')

如果沒有匹配到字元會返回一個None,並且呼叫group後會報錯

3、match

查詢字串中的指定的字元,只匹配開頭的字元,返回一個物件,需要用group方法取值

res = re.match('a','abac')  # 根據正則從頭開始匹配(文字內容必須在開頭匹配上)
print(res)
print(res.group())
if res:
    print(res.group())
else:
    print('不好意思 沒有找到')

如果沒有符合條件的資料 那麼match返回None 並且使用group會直接報錯

re模組其他方法

1、split

類似字串的切割,不過這裡就算切割字母左右沒有字元也會切割出一個空 ""

import re
先按'a'分割得到''和'bcd',在對''和'bcd'分別按'b'分割
res = re.split('[ab]','abcd')
print(res)  # ['', '', 'cd']

2、sub

類似字串內建方法的replace

# 類似於字串型別的replace方法
res = re.sub('\d','H','eva3jason4yuan4',1)  # 替換正則匹配到的內容
res = re.sub('\d','H','eva3jason4yuan4')  # 不寫預設替換所有
print(res)  # evaHjason4yuan4

3、subn

替換完成後會返回一個元組 ("更換後的字串", 被更換的個數)

"""返回元組 並提示替換了幾處"""
# res = re.subn('\d','H','eva3jason4yuan4',1)
# print(res)  # ('evaHjason4yuan4', 1)
# res = re.subn('\d','H','eva3jason4yuan4')
# print(res)  # ('evaHjasonHyuanH', 3)

4、compile

定義一個固定的正則表示式,可以多次重複使用匹配不同的字串

point = re.compile('<a>(.*?)</a>')
res1 = point.findall(date1)
res2 = point.search(date2)
res3 = point.match(date3)
res3 = point.finditer(date4)

regexp_obj = re.compile('\d+')
res = regexp_obj.search('absd213j1hjj213jk')
res1 = regexp_obj.match('123hhkj2h1j3123')
res2 = regexp_obj.findall('1213k1j2jhj21j3123hh')
print(res,res1,res2)

5、finditer

與findall的作用一致,但findall返回的是一個列表,當資料量很大,會特別佔用記憶體空間

而finditer會返回一個可迭代物件,當需要資料時,迭代獲取即可

# res = re.finditer('\d+','ashdklah21h23kj12jk3klj112312121kl131')
# print([i.group() for i in res])

6、search對分組的索引取值展示

# res = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$','110105199812067023')
# print(res)
# print(res.group())  # 110105199812067023
# print(res.group(1))  # 10105199812067
# print(res.group(2))  # 023

7、findall 對無名分組優先展示

findall針對分組優先展示 無名分組

res = re.findall("^[1-9]\d{14}(\d{2}[0-9x])?$",'110105199812067023')
print(res)  # ['023']

取消分組優先展示 無名分組

res1 = re.findall("^[1-9](?:\d{14})(?:\d{2}[0-9x])?$",'110105199812067023')
print(res1)

8、有名分組

res = re.search('^[1-9](?P<xxx>\d{14})(?P<ooo>\d{2}[0-9x])?$','110105199812067023')
print(res)
print(res.group())  # 110105199812067023
print(res.group(1))  # 10105199812067  無名分組的取值方式(索引取)
print(res.group('xxx'))  # 10105199812067
print(res.group('ooo'))  # 023

正則實戰案例

import re

# 讀取帶匹配的資料
with open(r'a.txt', 'r', encoding='utf8') as f:
    data = f.read()
# 利用正則匹配資料
# 分公司名稱
title_list = re.findall('<h2>(.*?)</h2>', data)
# print(title_list)
# 分公司地址
address_list = re.findall("<p class='mapIco'>(.*?)</p>", data)
# print(address_list)
# 分公司郵箱
email_list = re.findall("<p class='mailIco'>(.*?)</p>", data)
# print(email_list)
# 分公司電話
phone_list = re.findall("<p class='telIco'>(.*?)</p>", data)

res = zip(title_list, address_list, email_list, phone_list)
for data_tuple in res:
    print("""
    公司名稱:%s
    公司地址:%s
    公司郵箱:%s
    公司電話:%s
    """ % (data_tuple[0], data_tuple[1], data_tuple[2], data_tuple[3]))