国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

用 Python 的魔術(shù)方法做出更好的正則表達(dá)式 API

MangoGoing / 2975人閱讀

摘要:注原文地址為我的一個(gè)同事提到他錯(cuò)過了的正則表達(dá)式的語法糖。首先,從正則表達(dá)式檢索捕捉組需要兩個(gè)步驟。語法糖為了好玩,我把一個(gè)小小的增加了一些語法糖的正則表達(dá)式庫的幫助類放在一起。調(diào)用將調(diào)用類的方法。

  

注:原文地址為 Playing with Python Magic Methods to make a nicer Regex API

我的一個(gè)同事提到,他錯(cuò)過了 Ruby 的正則表達(dá)式的語法糖。我沒有使用過 Ruby 的正則表達(dá)式,但是以我對(duì) Python 的足夠了解知道 API 是缺少足夠的語法糖。

首先,從正則表達(dá)式檢索捕捉組需要兩個(gè)步驟。第一步,你需要調(diào)用 match() 或是 search(),并將結(jié)果分配給一個(gè)變量。然后,你需要檢查結(jié)果是否為 None(表明沒有發(fā)現(xiàn)匹配)。最后,如果匹配存在,你可以安全的提取捕獲組。下面是一個(gè)示例:

>>> import re
>>> match_obj = re.match("([0-9]+)", "123foo")
>>> match_obj  # What is `match_obj`?
<_sre.SRE_Match object at 0x7fd1bb000828>
>>> match_obj.groups()
("123",)

>>> match_obj = re.match("([0-9]+)", "abc")
>>> match_obj
None

還可以更好,在我看來,類似下面:

>>> re.get_matches("([0-9]+)", "123foo")
("123",)

>>> re.get_matches("([0-9]+)", "abc")
None

我經(jīng)常遇到的另外一件事情就是 re.sub 的混合參數(shù),它可以執(zhí)行正則的查找和替換。要求的參數(shù),按照順序,是 patternreplacementsearch_string。無論出于何種原因,對(duì)我來說,更直觀的是在替換之前使用 search_string

不幸的是,改編這些參數(shù)會(huì)導(dǎo)致“看起來正確”的結(jié)果。下面是一個(gè)例子,這里的目標(biāo)是使用單詞 bar 替換單詞 foo

>>> re.sub("foo", "replace foo with bar", "bar")
"bar"

>>> re.sub("foo", "bar", "replace foo with bar")
"replace bar with bar"
  

其中關(guān)于 re.sub 的用法可以參考這篇文章,很詳細(xì) http://www.crifan.com/python_re_sub_detailed_introduction/

在第一個(gè)例子中,我們可能會(huì)假設(shè)輸入的字符串只是“foo”。

語法糖

為了好玩,我把一個(gè)小小的增加了一些語法糖的 Python 正則表達(dá)式庫的幫助類放在一起。我不建議任何人都使用它,但好玩的是,也許它可以為你提供一些提高其他庫的語法的想法。

再我向你展示這個(gè)實(shí)現(xiàn)之前,這里有我設(shè)計(jì)的一個(gè) API 的示例。

尋找匹配的單步操作:

>>> def has_lower(s):
...     return bool(R/"[a-z]+"/s)

>>> has_lower("This contains lower-case")
True
>>> has_lower("NO LOWER-CASE HERE!")
False

檢索捕獲組也是非常容易的:

>>> list(R/"([0-9]+)"/"extract 12 the 456 numbers")
["12", "456"]

最后你可以使用字符串插值來實(shí)現(xiàn)替換:

>>> R/"(foo|bar)"/"replace foo and bar" % "Huey!"
"replace Huey! and Huey!"

你怎么認(rèn)為?是不是很有趣?

實(shí)現(xiàn)

這個(gè)實(shí)現(xiàn)是非常簡(jiǎn)單的,依賴于 Python 的魔術(shù)方法提供的 API。是否有一個(gè)整潔的技巧,本質(zhì)上,它是使用一個(gè)元類來實(shí)現(xiàn)類方法的操作符重載。

import re

class _R(type):
    def __div__(self, regex):
        return R(regex)

class R(object):
    __metaclass__ = _R

    def __init__(self, regex):
        self._regex = re.compile(regex)

    def __div__(self, s):
        return RegexOperation(self._regex, s)

class RegexOperation(object):
    def __init__(self, regex, search):
        self._regex = regex
        self._search = search

    def search(self):
        match =  self._regex.search(self._search)
        if match is not None:
            return match.groups()

    def __len__(self):
        return self._regex.search(self._search) is not None

    def __mod__(self, replacement):
        return self._regex.sub(replacement, self._search)

    def __iter__(self):
        return iter(self._regex.findall(self._search))

通過一步步的操作,希望它可以闡明幕后的知識(shí)。

調(diào)用 R / 將調(diào)用 _R 類的 __div__ 方法。它是一個(gè)創(chuàng)建 R 實(shí)例的工廠方法。

>>> R/"foo"

然后,在最新創(chuàng)建的 R 對(duì)象上調(diào)用 __div__ 方法,我們會(huì)得到一個(gè) RegexOperation 實(shí)例,因此 R.__div__ 是另外一個(gè)工廠方法。

>>> r_obj = R/"foo"
>>> r_obj / "bar"

最后的對(duì)象,RegexOperation 實(shí)現(xiàn)了一些魔法方法,允許我們檢索匹配,執(zhí)行替換,以及測(cè)試匹配是否存在。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/37326.html

相關(guān)文章

  • PHP小知識(shí)點(diǎn)

    摘要:那些瑣碎的知識(shí)點(diǎn)作者記錄的的很奇特很難記的知識(shí)點(diǎn)。易錯(cuò)知識(shí)點(diǎn)整理注意和的區(qū)別中和都是輸出的作用,但是兩者之間還是有細(xì)微的差別。今天手頭不忙,總結(jié)一下,分享過程中掌握的知識(shí)點(diǎn)。 深入理解 PHP 之:Nginx 與 FPM 的工作機(jī)制 這篇文章從 Nginx 與 FPM 的工作機(jī)制出發(fā),探討配置背后的原理,讓我們真正理解 Nginx 與 PHP 是如何協(xié)同工作的。 PHP 那些瑣碎的知識(shí)...

    hover_lew 評(píng)論0 收藏0
  • python學(xué)習(xí)筆記-魔術(shù)方法,讓自定義類更像內(nèi)置類型

    摘要:的魔術(shù)方法是中那些預(yù)定義的像類型的函數(shù)。使用的魔術(shù)方法的最大優(yōu)勢(shì)在于提供了簡(jiǎn)單的方法讓對(duì)象可以表現(xiàn)得像內(nèi)置類型一樣。廖雪峰老師教程里寫的是方法,不知道為啥。 Python的魔術(shù)方法是Python中那些預(yù)定義的像__XXX__類型的函數(shù)。使用Python的魔術(shù)方法的最大優(yōu)勢(shì)在于python提供了簡(jiǎn)單的方法讓對(duì)象可以表現(xiàn)得像內(nèi)置類型一樣。 __str__函數(shù) __str__函數(shù)用于處理打印...

    changfeng1050 評(píng)論0 收藏0
  • 你真知道Python字符串怎么嗎?

    摘要:方法可接收兩個(gè)參數(shù),第一個(gè)參數(shù)是分隔符,即用來分隔字符串的字符,默認(rèn)是所有的空字符,包括空格換行制表符等。拆分過程會(huì)消耗分隔符,所以拆分結(jié)果中不包含分隔符。 正如《你真的知道Python的字符串是什么嗎?》所寫,Python 中字符串是由 Uniocde 編碼的字符組成的不可變序列,它具備與其它序列共有的一些操作,例如判斷元素是否存在、拼接序列、切片操作、求長度、求最值、求元素的索引位...

    scwang90 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<