摘要:注原文地址為我的一個(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ù),按照順序,是 pattern,replacement, search_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 /
>>> 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
摘要:那些瑣碎的知識(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í)...
摘要:的魔術(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ù)用于處理打印...
摘要:方法可接收兩個(gè)參數(shù),第一個(gè)參數(shù)是分隔符,即用來分隔字符串的字符,默認(rèn)是所有的空字符,包括空格換行制表符等。拆分過程會(huì)消耗分隔符,所以拆分結(jié)果中不包含分隔符。 正如《你真的知道Python的字符串是什么嗎?》所寫,Python 中字符串是由 Uniocde 編碼的字符組成的不可變序列,它具備與其它序列共有的一些操作,例如判斷元素是否存在、拼接序列、切片操作、求長度、求最值、求元素的索引位...
閱讀 555·2021-11-25 09:44
閱讀 2645·2021-11-24 09:39
閱讀 2315·2021-11-22 15:29
閱讀 3529·2021-11-15 11:37
閱讀 3395·2021-09-24 10:36
閱讀 2523·2021-09-04 16:41
閱讀 1004·2021-09-03 10:28
閱讀 1859·2019-08-30 15:55