最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中對正則表達式re包的簡單引用方式

 更新時間:2022年02月09日 16:46:09   作者:solitary_w  
這篇文章主要介紹了python中對正則表達式re包的簡單引用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

對正則表達式re包的簡單引用

正則表達式一直是被我所忽略的東西,因為在之前的學習和開發(fā)中基本很少用到它。而且,之前學習正則表達式時感覺很懵逼,所以毅然決然的放棄了(QAQ),然而出來混總歸還是要還的。最近在弄日志處理時,必須用到正則表達式,這就讓我不得不拿起正則表達式了。在此記錄一些自己學習的筆記與案例。

在python中導入re包

import re ?

一、re.match(pattern,string,flags=0)

嘗試從字符串 開始 位置(看清楚,開始位置?。。。┢ヅ湟粋€模式。成功則返回一個match對象,失敗則是none

參數說明:

  • pattern:正則表達式
  • string:字符串
  • flags:可選標志位

注:可選標志在下面簡單說明

獲取對象的方法:

使用group(num)  來獲取對象小組內的內容。

舉例:

#_*_coding:utf8_*_
import re 
str1='010-011-110'
pattern = r'\d{3}-\d{3}-\d{3}'
match = re.match(pattern,str1)
print match.group()
print match.group(0)
print match.group(1)
print match.group(2)
print match.group(3)
 
#輸出為:
010-011-110
010-011-110
010
011
110

match()方法最重要的一點就是它是從字符串開始匹配的,切記這一點······我已經在這點上犯了很多錯誤了。

在寫簡單的正則表達式的時候我們可以用()來進行分組,以便于我們在后續(xù)處理中取值。后續(xù)也會談到通過命名捕獲的方式來取值。

二、re.search(pattern,string,flags=0)

跟match函數參數一樣,它也是用來匹配字符串的。而最大的不同在于它可以從字符串的任意位置匹配,不像match一樣,僅限于從字符串開始位置。參數跟match一樣,就不做說明了,直接上例子。

#與match例子不同,001前面有很多空格
str1='    001-010-110'
#與match中的模式一樣
pattern = r'\d{3}-\d{3}-\d{3}'
#若此時用match()函數,結果肯定是不匹配的。
search = re.search(pattern,str1)
print search.group()
print search.group(0)
print search.group(1)
print search.group(2)
print search.group(3)
 
#結果:
001-010-110
001-010-110
001
010
110

對于match和search,還是得說一遍,注意一個必須是從字符串開始處匹配,一個是任意位置。

三、檢索和替換 re.sub()

用于替換字符串中的匹配項

re.sub(pattern,repl,string,count,flags)

參數說明:

  • pattern:正則表達式
  • repl:替換的字符串,可為一個函數
  • string:要被查找的原始字符串
  • count:被替換的次數,默認替換所有匹配項
  • flags:標志位      
#_*_coding:utf-8_*_
import re 
phone = "888-7777-6666 #好牛的號碼
#刪除字符串中的注釋
num = re.sub(r'#.*','',phone)
print num
#刪除注釋和-
realphone = re.sub(r'\D','',phone)
print realphone
#結果為:
888-7777-6666
88877776666

sub函數理解起來不難,但要主要的是在repl參數的使用。repl可以為一個函數。例如:

將字符串中的數字乘以二

def double(match):
? ? value = int(match.group('value'))
? ? return str(value*2)
s='APPLE23EFG567'
print re.sub(r'(?P<value>\d+)',double,s)
?
#結果為:
?APPLE46EFG1134

因為repl為一個函數,所以再替換的時候會替換為函數的返回值。

注:?P<value>為正則表達式的命名捕獲,在下面將會做簡單記錄

四、正則表達式之命名捕獲

格式為: ?P<name>

在處理字符串取值時往往會用到

例子:

num = '001-010-110'
pattern = r'(\d{3})-(\d{3})-(\d{3})'
match = re.match(pattern,num)
print match.group()       #001-010-110
print match.group(1)      #001
print match.group(2)      #010
print match.group(3)      #110

在上述例子要分別獲取每項的值就要使用group(num),而當正則表達式變得復雜的時候,再用num取值時,很有可能會取到錯誤的值。所以就提出使用命名捕獲,下面為簡單例子:

pattern = r'(?P<Area>\d{3})-(?P<zhong>\d{3})-(?P<wei>\d{3})'
match = re.match(patter, num)
?
print match.group('Area') ? ? #001
print match.group('zhong') ? ?#010
print match/group('wei') ? ? ?#110

雖然在上述例子中使用命名捕獲會將降低正則表達式的可讀性,但命名捕獲咋復雜的正則中,會準確獲取想要的值(當然,正則肯定得寫準確啊·····)

re庫的正確使用姿勢

前提假設:

  • 已經充分掌握PCRE風格正則表達式
  • 熟讀re庫文檔

Why

正則表達式的強大已不用我贅述,Python 對此的支持也是十分強大,只不過:

re.search(pattern, string, flags=0)
re.match(pattern, string, flags=0)
......

你能很麻利地使用如上所示的一系列模塊級別function 嗎,如果你天天用 Python 搞正則匹配,相信你一定很熟練。但是如果你需要每次臨時翻閱文檔才能知道如何使用它,那么就要思考:是不是 API 在某種程度上設計不好了(有的語言的 pattern 極有可能不是放在首位)。

一般來說,API 的接口參數越少越好,最好的就是沒有參數,調用者無腦調用,沒有任何記憶負擔。而 Python 的 re 庫,在我看來,應該至少糅合了「命令式」與「OOP」兩種風格,而且接口也不「最小化,正交」。

使用姿勢

正確的姿勢應該是:只用 OOP 風格,并且完全忘記 re 庫提供的一系列模塊級別的 function (如 re.search, re.match等)。

首先是每次都構造出 Regex 對象,然后由 Regex 對象得出 Match 對象,然后在 Regex 對象和 Match 對象上進行一系列操作。比如:

# 1. 構造
    REGEX = re.compile($pattern, flags)     flags是re模塊的常量
 
# 2. 獲取 MatchObject
    m = regex.search(string)
   
# 3. 后續(xù) MatchObject 的使用
    1. 獲取分組  group()    
    2. groups
    3. groupdict()

應用舉例

比如我在自己構造的 PathUtils 中,就是如此使用的(我非常喜歡各種各樣的 Utils ):

from __future__ import (absolute_import, unicode_literals) 
import re 
class PathUtils(object):
    """路徑操作的工具函數"""
 
    _LINUX_ROOT = '/'
    _LINUX_PATH_SPLITOR = '/'
 
    @classmethod
    def is_two_linux_path_contains(cls, path1, path2):
        """兩個Linux路徑是否存在互相包含關系"""
 
        if path1 == cls._LINUX_ROOT or path2 == cls._LINUX_ROOT:
            return True
 
        path1_split = path1.split(cls._LINUX_PATH_SPLITOR)
        path2_split = path2.split(cls._LINUX_PATH_SPLITOR)
 
        for item1, item2 in zip(path1_split, path2_split):
            if item1 != item2:
                return False 
        return True
 
    @classmethod
    def is_valid_linux_path(cls, path):
        if not path:
            return False
 
        LINUX_PATH_REGEX = r'^(/[^/ ]*)+/?$' 
        return cls.is_valid_pattern(path, LINUX_PATH_REGEX)
 
    @classmethod
    def is_valid_windows_path(cls, path):
        if not path:
            return False
 
        WINDOWS_PATH_REGEX = r'^[a-zA-Z]:\\(((?![<>:"/\\|?*]).)+((?<![ .])\\)?)*$' 
        return cls.is_valid_pattern(path, WINDOWS_PATH_REGEX)
 
    @classmethod
    def is_valid_path(cls, p):
        if not p:
            return False
 
        return cls.is_valid_linux_path(p) or cls.is_valid_windows_path(p)
 
    @classmethod
    def is_valid_pattern(cls, value, pattern):
        if not value:
            return False
 
        REGEX = re.compile(pattern, re.UNICODE) 
        m = REGEX.match(value) 
        return True if m else False

主要的功能函數就是:

@classmethod
def is_valid_pattern(cls, value, pattern):
? ? if not value:
? ? ? ? return False?
? ? REGEX = re.compile(pattern, re.UNICODE)?
? ? m = REGEX.match(value)?
? ? return True if m else False

這樣一系列流程下來,我的感受就是,re 庫的接口沒有需要記憶,也沒有需要臨時翻閱文檔的地方,并且我只用這一種風格(自己熟悉的,效率總是最高的),比如 re.compile肯定只需要傳一個參數(flags不是必要的),REGEX_OBJ.match/search肯定只需要傳need_search_string即可。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Python使用matplotlib繪圖無法顯示中文問題的解決方法

    Python使用matplotlib繪圖無法顯示中文問題的解決方法

    這篇文章主要介紹了Python使用matplotlib繪圖無法顯示中文問題的解決方法,結合具體實例形式分析了Python使用matplotlib繪圖時出現中文亂碼的原因與相關解決方法,需要的朋友可以參考下
    2018-03-03
  • Python os.mkdir()與os.makedirs()的使用區(qū)別

    Python os.mkdir()與os.makedirs()的使用區(qū)別

    這篇文章主要介紹了Python os.mkdir()與os.makedirs()的使用區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • 淺談Python實現opencv之圖片色素的數值運算和邏輯運算

    淺談Python實現opencv之圖片色素的數值運算和邏輯運算

    今天帶大家來學習的是關于Python的相關知識,文章圍繞著圖片色素的數值運算和邏輯運算展開,文中有非常詳細的的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 詳解Python字符串切片

    詳解Python字符串切片

    這篇文章主要介紹了Python字符串切片,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • Python數學建模學習模擬退火算法多變量函數優(yōu)化示例解析

    Python數學建模學習模擬退火算法多變量函數優(yōu)化示例解析

    模擬退火算法借鑒了統(tǒng)計物理學的思想,是一種簡單、通用的啟發(fā)式優(yōu)化算法,并在理論上具有概率性全局優(yōu)化性能,因而在科研和工程中得到了廣泛的應用
    2021-10-10
  • python爬蟲之請求模塊urllib的基本使用

    python爬蟲之請求模塊urllib的基本使用

    urllib是python內置的HTTP請求庫,是一個用來處理網絡請求的python標準庫,下面這篇文章主要給大家介紹了關于python爬蟲之請求模塊urllib的基本使用,需要的朋友可以參考下
    2022-04-04
  • python中提高pip install速度

    python中提高pip install速度

    本文給大家分享了如何提高pip install速度的方法,其實就是將默認源替換為國內高速的源,非常的簡單實用,有需要的小伙伴可以參考下
    2020-02-02
  • Python中的正則表達式與JSON數據交換格式

    Python中的正則表達式與JSON數據交換格式

    正則表達式 是一個特殊的字符序列,一個字符串是否與我們所設定的這樣的字符序列,相匹配快速檢索文本、實現替換文本的操作。這篇文章主要介紹了Python中的正則表達式與JSON ,需要的朋友可以參考下
    2019-07-07
  • python算法演練_One Rule 算法(詳解)

    python算法演練_One Rule 算法(詳解)

    下面小編就為大家?guī)硪黄猵ython算法演練_One Rule 算法(詳解)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Python數據分析與機器學習在金融風控中的應用小結

    Python數據分析與機器學習在金融風控中的應用小結

    本篇詳解了Python數據分析與機器學習在金融風控中的應用,包括數據收集與預處理、信用風險評估模型、市場風險管理模型和操作風險監(jiān)控模型,感興趣的朋友跟隨小編一起看看吧
    2024-06-06

最新評論

乌恰县| 克山县| 河曲县| 彭泽县| 宜都市| 乾安县| 玉田县| 自治县| 兰考县| 海口市| 全州县| 嵊泗县| 彭阳县| 苏尼特右旗| 达拉特旗| 普兰县| 铜山县| 德庆县| 枣庄市| 凤庆县| 银川市| 新津县| 千阳县| 长宁区| 大姚县| 青龙| 封丘县| 土默特右旗| 重庆市| 全州县| 定南县| 三明市| 沿河| 盐边县| 丹阳市| 文山县| 怀宁县| 本溪| 固阳县| 凤山县| 乌鲁木齐市|