Python?正則表達式基礎(chǔ)知識點及實例
1. 什么是正則表達式
正則表達式(Regular Expressions),也稱為 “regex” 或 “regexp” 是使用單個字符串來描述、匹配一系列匹配某個句法規(guī)則的字符串,這樣程序就可以將該模式與任意文本字符串相匹配。
使用正則表達式,可以為要匹配的可能字符串集指定規(guī)則;此集可能包含英語句子,電子郵件地址,TeX命令或你喜歡的任何內(nèi)容
正則表達式引擎
采用不同算法,檢查處理正則表達式的軟件模塊 PCRE (perl compatible regular expressions)
正則表達式的元字符分類: 字符匹配,匹配次數(shù),位置錨定,分組
Python的正則表達式是PCRE標準的。
2. 正則表達式基礎(chǔ)
# 字符匹配
. 匹配任意單個字符(換行符除外)
[]匹配指定范圍內(nèi)的任意單個字符: [0-9] [a-z]
^[xxx]以[]內(nèi)的任意字符開頭
[^xxx]: 除了[]內(nèi)的字符,相當于取反
# 匹配次數(shù)
用于指定前面的字符要出現(xiàn)幾次
* 匹配前面的字符的任意次,包括0次, 貪婪匹配:盡可能長的匹配
.* 任意長度的任意字符
? 匹配其前面的字符0或1次
+ 匹配前面的字符至少1次
{n} 匹配前面的字符n次
{m,n} 匹配前面的字符至少m次,最多n次如{1,3} 匹配1到3次
{n,} 匹配前面的字符至少n次# 位置錨定
# 用于定位出現(xiàn)的位置^ 行首
$ 行尾
^$ 空行
# 分組
() 分組,用()將多個字符捆綁在一起,當作一個整體處理
后向引用: \1,\2# | 或者
a|b a 或 b
(A|a)bc Abc或abc# \ 轉(zhuǎn)義
\ 反斜杠后面可以跟各種字符,以指示各種特殊序列。它也用于轉(zhuǎn)義所有元字符.因此您仍然可以在模式中匹配它們,如果你需要匹配 [ 或 \,你可以在它們前面加一個反斜杠來移除它們的特殊含義:\[ 或 \\。
在python中取消轉(zhuǎn)義推薦使用r,如果要匹配'\n',因為'\n'有特殊含義:回車。要匹配'\n'可以以寫'\\n',在Python中可以使用r'\n'。\d 匹配任何十進制數(shù),等價于類 [0-9]
\w 匹配任何字母與數(shù)字字符包括下劃線;這相當于類 [a-zA-Z0-9_]。
\s 匹配任何空白字符;這等價于類 [ \t\n\r\f\v]。\D 匹配任何非數(shù)字字符;這等價于類 [^0-9]。
\W 匹配任何非字母與數(shù)字字符;這相當于類 [^a-zA-Z0-9_]。
\S 匹配任何非空白字符;這相當于類 [^ \t\n\r\f\v]。
3. Python中使用正則表達式
在python中使用正則表達式常用的模塊為:re。
3.1 re常用的方法
# re.findall('正則表達式','待匹配的文本') 根據(jù)正則匹配出所有符合條件的數(shù)據(jù),返回列表
>>> re.findall('[0-9]', "Hello world 123")
['1', '2', '3']
# 如果匹配不到findall返回一個空列表
# re.finditer('正則表達式','待匹配的文本') 根據(jù)正則匹配出所有符合條件的數(shù)據(jù),返回一個對象
>>> re.finditer('[0-9]', "Hello world 123")
<callable_iterator object at 0x7f3409296d68>
# 取值:
>>> res = re.finditer('[0-9]', "Hello world 123")
>>> for i in res:
... print(i.group())
...
1
2
3
# 如果匹配不到finditer返回空。
# findall 和finditer功能一樣,但是finditer更節(jié)省內(nèi)存。
# re.search('正則表達式','待匹配的文本') 根據(jù)正則匹配到一個符合條件的就結(jié)束
>>> res = re.search('l', "Hello world 123")
>>> res
<_sre.SRE_Match object; span=(2, 3), match='l'>
>>> res.group()
'l'
# 匹配到一個就返回,group()返回具體的元素,如果匹配不到search返回None,使用group取值就會報錯:
AttributeError: 'NoneType' object has no attribute 'goup'
# re.match('正則表達式','待匹配的文本') 根據(jù)正則從頭開始匹配(文本內(nèi)容必須在開頭匹配上)
>>> res = re.match('e', "Hello world 123") # e 不在開頭,所以匹配不上,返回None
>>> print(res)
None
>>> res = re.match('H', "Hello world 123") # H 為開頭能匹配上
>>> print(res)
<_sre.SRE_Match object; span=(0, 1), match='H'>
>>> print(res.group())
H
#如果沒有匹配到,match會返回None 使用group取值的時候也會直接報錯
AttributeError: 'NoneType' object has no attribute 'group'
# search和match匹配不到都會報錯,可以處理一下:
if res:
print(res.group())
else:
print('沒有匹配到')
# re.split 分割
>>> re.split('[0-9]', "Hello 123 world") # 按匹配到的分割,返回一個列表
['Hello ', '', '', ' world']
# re.sub('要匹配的', '要替換的', '文本') 替換
>>> re.sub('[0-9]','A', "Hello 123 world") # 默認替換全部
'Hello AAA world'
>>> re.sub('[0-9]','A', "Hello 123 world",1) # 替換一次
'Hello A23 world'
>>> re.sub('[0-9]','A', "Hello 123 world",2) # 替換兩次
'Hello AA3 world'
# re.subn() 和re.sub 功能一樣,但是返回元組 并提示替換了幾處
>>> re.subn('[0-9]','A', "Hello 123 world")
('Hello AAA world', 3)
>>> re.subn('[0-9]','A', "Hello 123 world", 1)
('Hello A23 world', 1)
# 如果一個正則表達式在程序中經(jīng)常用到,這樣每次都寫太麻煩,可以使用compile將正則表達式的樣式編譯為一個正則表達式對象 (正則對象)
# 例如 正則表達式'^\d{3,6}'經(jīng)常使用
>>> obj = re.compile('^\d{3,6}')
>>> obj.findall("123 Hello")
['123']
>>> res = obj.search("123 Hello")
>>> res.group()
'123'
# obj還可以使用 finditer,match,split,subn,sub
# 分組
>>> res = re.search('[1-9]\d{16}([0-9x])','37152119841105155x')
>>> res.group()
'37152119841105155x'
>>> res.group(1) # 只打印分組1里的內(nèi)容,1為第一個分組,這里面只有([0-9x])所以打印x
'x'
>>> res = re.search('[1-9](\d{16})([0-9x])','37152119841105155x')
>>> res.group()
'37152119841105155x'
>>> res.group(1) # (\d{16}) 為第1個分組
'7152119841105155'
>>> res.group(2) # ([0-9x]) 為第2個分組
'x'
# 這種取分組里的值也為索引取值
# findall優(yōu)先打印出分組里的內(nèi)容
>>> re.findall('[1-9]\d{16}([0-9x])','37152119841105155x')
['x']
# 取消分組: ?:
>>> res = re.findall('[1-9]\d{16}(?:[0-9x])','37152119841105155x')
>>> res # (?:[0-9x])
['37152119841105155x']
# 上面的分組為無名分組,分組也可以有名字。
# 有名分組 ?P<分組名稱>
>>> res = re.search('[1-9](?P<first>\d{16})(?P<second>[0-9x])','37152119841105155x')
>>> res.group()
'37152119841105155x'
>>> res.group('first')
'7152119841105155'
>>> res.group('second')
'x'
# 分組后也可以使用索引到值:
>>> res.group(2)
'x'
3.2 re模塊練習(xí)
爬鏈家二手房前十頁
import re
import requests
for i in range(1,11):
url = 'https://bj.lianjia.com/ershoufang/pg{}srs%E6%97%A7%E5%AE%AB/'.format(i)
r = requests.get(url)
title = re.findall('data-is_focus="" data-sl="">(.*?)</a>',r.text)
price = re.findall('<span>([0-9]{3})</span>',r.text)
address = re.findall('data-log_index="\d" data-el="region">(.*?)</a>', r.text)
houseIcon = re.findall('<span class="houseIcon"></span>(.*?)</div>', r.text)
res = zip(title,price,address,houseIcon)
for i in res:
# print("%s \t%s(萬) \t%s\t%s" % (i[0], i[1], i[2], i[3]))
print("""
小區(qū)名: %s,
總價: %s萬,
地址: %s,
房型: %s""" % (i[0], i[1], i[2], i[3]))
# 執(zhí)行結(jié)果:
[root@hans_tencent_centos82 module]# python3 houses.py
小區(qū)名: 紅星樓小區(qū) 南北通透一居室 滿五唯一商品房,
總價: 185萬,
地址: 紅星樓 ,
房型: 1室1廳 | 46.46平米 | 南 北 | 簡裝 | 頂層(共6層) | 1989年建 | 板樓
小區(qū)名: 舊宮北里 2室2廳 南 北,
總價: 469萬,
地址: 舊宮北里 ,
房型: 2室2廳 | 96.55平米 | 南 北 | 精裝 | 高樓層(共9層) | 2004年建 | 板樓
小區(qū)名: 亦莊北岸 3室1廳 南 北,
總價: 558萬,
地址: 亦莊北岸 ,
房型: 3室1廳 | 109.58平米 | 南 北 | 精裝 | 中樓層(共15層) | 2008年建 | 板塔結(jié)合
參考內(nèi)容:
內(nèi)容擴展:
Python對正則表達式的支持
Python提供了re模塊來支持正則表達式相關(guān)操作,下面是re模塊中的核心函數(shù)。
| 函數(shù) | 說明 |
|---|---|
| compile(pattern, flags=0) | 編譯正則表達式返回正則表達式對象 |
| match(pattern, string, flags=0) | 用正則表達式匹配字符串 成功返回匹配對象 否則返回None |
| search(pattern, string, flags=0) | 搜索字符串中第一次出現(xiàn)正則表達式的模式 成功返回匹配對象 否則返回None |
| split(pattern, string, maxsplit=0, flags=0) | 用正則表達式指定的模式分隔符拆分字符串 返回列表 |
| sub(pattern, repl, string, count=0, flags=0) | 用指定的字符串替換原字符串中與正則表達式匹配的模式 可以用count指定替換的次數(shù) |
| fullmatch(pattern, string, flags=0) | match函數(shù)的完全匹配(從字符串開頭到結(jié)尾)版本 |
| findall(pattern, string, flags=0) | 查找字符串所有與正則表達式匹配的模式 返回字符串的列表 |
| finditer(pattern, string, flags=0) | 查找字符串所有與正則表達式匹配的模式 返回一個迭代器 |
| purge() | 清除隱式編譯的正則表達式的緩存 |
| re.I / re.IGNORECASE | 忽略大小寫匹配標記 |
| re.M / re.MULTILINE | 多行匹配標記 |
說明:?上面提到的re模塊中的這些函數(shù),實際開發(fā)中也可以用正則表達式對象的方法替代對這些函數(shù)的使用,如果一個正則表達式需要重復(fù)的使用,那么先通過compile函數(shù)編譯正則表達式并創(chuàng)建出正則表達式對象無疑是更為明智的選擇。
到此這篇關(guān)于Python 正則表達式基礎(chǔ)知識點及實例的文章就介紹到這了,更多相關(guān)Python 正則表達式 淺析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django 實現(xiàn)Admin自動填充當前用戶的示例代碼
今天小編就為大家分享一篇Django 實現(xiàn)Admin自動填充當前用戶的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
Python實現(xiàn)統(tǒng)計給定字符串中重復(fù)模式最高子串功能示例
這篇文章主要介紹了Python實現(xiàn)統(tǒng)計給定字符串中重復(fù)模式最高子串功能,涉及Python針對字符串的遍歷、排序、切片、運算等相關(guān)操作技巧,需要的朋友可以參考下2018-05-05
基于python的selenium兩種文件上傳操作實現(xiàn)詳解
這篇文章主要介紹了基于python的selenium兩種文件上傳操作實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09
Python求區(qū)間正整數(shù)內(nèi)所有素數(shù)之和的方法實例
這篇文章主要給大家介紹了Python對區(qū)間正整數(shù)內(nèi)所有素數(shù)之和的相關(guān)資料,文中介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10

