欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python?正則表達式基礎(chǔ)知識點及實例

 更新時間:2021年12月05日 14:43:52   作者:Hans_Wang  
在本篇文章里小編給大家整理了關(guān)于Python正則表達式的一些基礎(chǔ)知識點以及相關(guān)用法實例內(nèi)容,需要的朋友們可以參考下。

1. 什么是正則表達式

正則表達式(Regular Expressions),也稱為 “regex” 或 “regexp” 是使用單個字符串來描述、匹配一系列匹配某個句法規(guī)則的字符串,這樣程序就可以將該模式與任意文本字符串相匹配。

使用正則表達式,可以為要匹配的可能字符串集指定規(guī)則;此集可能包含英語句子,電子郵件地址,TeX命令或你喜歡的任何內(nèi)容

正則表達式引擎

采用不同算法,檢查處理正則表達式的軟件模塊 PCRE (perl compatible regular expressions)

正則表達式的元字符分類: 字符匹配,匹配次數(shù),位置錨定,分組

Python的正則表達式是PCRE標(biāo)準(zhǔn)的。

2. 正則表達式基礎(chǔ)

# 字符匹配

. 匹配任意單個字符(換行符除外)

[]匹配指定范圍內(nèi)的任意單個字符: [0-9] [a-z]

^[xxx]以[]內(nèi)的任意字符開頭

[^xxx]: 除了[]內(nèi)的字符,相當(dāng)于取反

# 匹配次數(shù)

用于指定前面的字符要出現(xiàn)幾次

* 匹配前面的字符的任意次,包括0次, 貪婪匹配:盡可能長的匹配
.* 任意長度的任意字符
? 匹配其前面的字符0或1次
+ 匹配前面的字符至少1次
{n} 匹配前面的字符n次
{m,n} 匹配前面的字符至少m次,最多n次如{1,3} 匹配1到3次
{n,} 匹配前面的字符至少n次

# 位置錨定
# 用于定位出現(xiàn)的位置

^ 行首

$ 行尾

^$ 空行

# 分組
() 分組,用()將多個字符捆綁在一起,當(dāng)作一個整體處理
后向引用: \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ù)字字符包括下劃線;這相當(dāng)于類 [a-zA-Z0-9_]。
\s 匹配任何空白字符;這等價于類 [ \t\n\r\f\v]。

\D 匹配任何非數(shù)字字符;這等價于類 [^0-9]。
\W 匹配任何非字母與數(shù)字字符;這相當(dāng)于類 [^a-zA-Z0-9_]。
\S 匹配任何非空白字符;這相當(dāng)于類 [^ \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)容:

Python官方文檔

內(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 忽略大小寫匹配標(biāo)記
re.M / re.MULTILINE 多行匹配標(biāo)記

說明:?上面提到的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自動填充當(dāng)前用戶的示例代碼

    Django 實現(xiàn)Admin自動填充當(dāng)前用戶的示例代碼

    今天小編就為大家分享一篇Django 實現(xiàn)Admin自動填充當(dāng)前用戶的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Python實現(xiàn)統(tǒng)計給定字符串中重復(fù)模式最高子串功能示例

    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)詳解

    這篇文章主要介紹了基于python的selenium兩種文件上傳操作實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • Python求區(qū)間正整數(shù)內(nèi)所有素數(shù)之和的方法實例

    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
  • Python之random庫的常用函數(shù)有哪些

    Python之random庫的常用函數(shù)有哪些

    這篇文章主要為大家詳細介紹了Python之random庫的常用函數(shù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Python圖像文字識別詳解(附實戰(zhàn)代碼)

    Python圖像文字識別詳解(附實戰(zhàn)代碼)

    這篇文章主要給大家介紹了關(guān)于Python圖像文字識別的相關(guān)資料,本文介紹使用python進行圖像的文字識別,將圖像中的文字提取出來,可以幫助我們完成很多有趣的事情,需要的朋友可以參考下
    2024-02-02
  • 如何在python中判斷變量的類型

    如何在python中判斷變量的類型

    這篇文章主要介紹了如何在python中判斷變量的類型,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Python+OpenCV繪制灰度直方圖詳解

    Python+OpenCV繪制灰度直方圖詳解

    一幅圖像由不同灰度值的像素組成,圖像中灰度的分布情況是該圖像的一個重要特征。圖像的灰度直方圖就描述了圖像中灰度分布情況。本文將利用Python和OpenCV繪制灰度直方圖,需要的可以參考一下
    2022-03-03
  • 完美解決matplotlib子圖坐標(biāo)軸重疊問題

    完美解決matplotlib子圖坐標(biāo)軸重疊問題

    這篇文章主要介紹了完美解決matplotlib子圖坐標(biāo)軸重疊問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Python API 操作Hadoop hdfs詳解

    Python API 操作Hadoop hdfs詳解

    這篇文章主要介紹了Python API 操作Hadoop hdfs詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06

最新評論