摘要:注原文地址為我的一個同事提到他錯過了的正則表達式的語法糖。首先,從正則表達式檢索捕捉組需要兩個步驟。語法糖為了好玩,我把一個小小的增加了一些語法糖的正則表達式庫的幫助類放在一起。調用將調用類的方法。
注:原文地址為 Playing with Python Magic Methods to make a nicer Regex API
我的一個同事提到,他錯過了 Ruby 的正則表達式的語法糖。我沒有使用過 Ruby 的正則表達式,但是以我對 Python 的足夠了解知道 API 是缺少足夠的語法糖。
首先,從正則表達式檢索捕捉組需要兩個步驟。第一步,你需要調用 match() 或是 search(),并將結果分配給一個變量。然后,你需要檢查結果是否為 None(表明沒有發現匹配)。最后,如果匹配存在,你可以安全的提取捕獲組。下面是一個示例:
>>> 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
我經常遇到的另外一件事情就是 re.sub 的混合參數,它可以執行正則的查找和替換。要求的參數,按照順序,是 pattern,replacement, search_string。無論出于何種原因,對我來說,更直觀的是在替換之前使用 search_string。
不幸的是,改編這些參數會導致“看起來正確”的結果。下面是一個例子,這里的目標是使用單詞 bar 替換單詞 foo。
>>> re.sub("foo", "replace foo with bar", "bar") "bar" >>> re.sub("foo", "bar", "replace foo with bar") "replace bar with bar"
其中關于 re.sub 的用法可以參考這篇文章,很詳細 http://www.crifan.com/python_re_sub_detailed_introduction/
在第一個例子中,我們可能會假設輸入的字符串只是“foo”。
語法糖為了好玩,我把一個小小的增加了一些語法糖的 Python 正則表達式庫的幫助類放在一起。我不建議任何人都使用它,但好玩的是,也許它可以為你提供一些提高其他庫的語法的想法。
再我向你展示這個實現之前,這里有我設計的一個 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"]
最后你可以使用字符串插值來實現替換:
>>> R/"(foo|bar)"/"replace foo and bar" % "Huey!" "replace Huey! and Huey!"
你怎么認為?是不是很有趣?
實現這個實現是非常簡單的,依賴于 Python 的魔術方法提供的 API。是否有一個整潔的技巧,本質上,它是使用一個元類來實現類方法的操作符重載。
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))
通過一步步的操作,希望它可以闡明幕后的知識。
調用 R /
>>> R/"foo"
然后,在最新創建的 R 對象上調用 __div__ 方法,我們會得到一個 RegexOperation 實例,因此 R.__div__ 是另外一個工廠方法。
>>> r_obj = R/"foo" >>> r_obj / "bar"
最后的對象,RegexOperation 實現了一些魔法方法,允許我們檢索匹配,執行替換,以及測試匹配是否存在。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37326.html
摘要:的魔術方法是中那些預定義的像類型的函數。使用的魔術方法的最大優勢在于提供了簡單的方法讓對象可以表現得像內置類型一樣。廖雪峰老師教程里寫的是方法,不知道為啥。 Python的魔術方法是Python中那些預定義的像__XXX__類型的函數。使用Python的魔術方法的最大優勢在于python提供了簡單的方法讓對象可以表現得像內置類型一樣。 __str__函數 __str__函數用于處理打印...
摘要:方法可接收兩個參數,第一個參數是分隔符,即用來分隔字符串的字符,默認是所有的空字符,包括空格換行制表符等。拆分過程會消耗分隔符,所以拆分結果中不包含分隔符。 正如《你真的知道Python的字符串是什么嗎?》所寫,Python 中字符串是由 Uniocde 編碼的字符組成的不可變序列,它具備與其它序列共有的一些操作,例如判斷元素是否存在、拼接序列、切片操作、求長度、求最值、求元素的索引位...
閱讀 550·2021-11-25 09:44
閱讀 2636·2021-11-24 09:39
閱讀 2305·2021-11-22 15:29
閱讀 3520·2021-11-15 11:37
閱讀 3379·2021-09-24 10:36
閱讀 2507·2021-09-04 16:41
閱讀 992·2021-09-03 10:28
閱讀 1833·2019-08-30 15:55