有了這個庫,以後再也不用寫正則表示式了!
這是「進擊的Coder」的第 715 篇技術分享
作者:崔慶才
正則表示式大家應該有了解過吧?它功能很強大,但有一個痛點就是不太容易讀寫,我們需要了解正則的很多語法規則才能寫出一個健壯的正則表示式,很多朋友估計聽到正則表示式估計都焦頭爛額了。
就沒有解決辦法嗎?
有的,今天給大家介紹一個可以讓我們用“人類”的方式來寫正則表示式的庫。
Humre
沒錯,這個庫就是 Humre,就是 Human(人類) + re(正則表示式) 的組合,單看這個名字還是很有來頭啊。
GitHub 地址: https://github.com/asweigart/humre
PyPi: https://pypi.org/project/Humre/
這個庫其實很新,第一次 commit 是在 2022/7/21,作者是 Al Sweigart,就是寫 pyautogui 庫(已有 7.1k star)的那個人,所以還是有一定可信賴度的。
這個庫解決的問題就是讓我們可以用更“人類”,也就是更語義化的方式編寫正則表示式。
“
注意:當前時間(2022/9/4)這個庫還沒有釋出 1.0 版本,所以相關 API 可能會更改,具體的最新 API 請參考原 GitHub 倉庫的最新說明。
”
基本體驗
OK,我們先來一個例子看看,比如我們我們現在要從一段文字中提取出一個電話號碼,比如原文字如下:
Call 415-555-1234 today!
我們需要提取出其中的電話號碼,那麼用常規的正則表示式就是這麼寫的:
\d{3}-\d{3}-\d{4}
意思就是匹配“三個數字-三個數字-四個數字”,那麼用 Python 就可以這麼寫:
from re import *
text = 'Call 415-555-1234 today!'
regexStr = '\d{3}-\d{3}-\d{4}'
result = compile(regexStr).search(text)
print(result.group())
那麼用 Humre 就可以寫成這樣:
from humre import *
text = 'Call 415-555-1234 today!'
regexStr = exactly(3, DIGIT) + '-' + exactly(3, DIGIT) + '-' + exactly(4, DIGIT)
result = compile(regexStr).search(text)
print(result.group())
可以看到整個正則表示式就變得語義化了, exactly
指的就是精確匹配, DIGIT
指的就是數字, exactly(3, DIGIT)
就是精確匹配三個數字,也就是 \d{3}
的意思。
執行結果都是一樣的:
415-555-1234
我們觀察可以發現,這裡我們僅僅是把 re 這個庫換成了 humre,然後修改了下 regexStr
就可以實現正則表示式的語義化表示了,是不是還挺簡單的?
這時候有人說,我現在也沒感覺出這個庫有什麼優勢啊,反而寫得更長了。
那好,咱們再來一個例子,找出所有十六進位制數字,這個十六進位制數字可能帶字首 0x
或者 0X
,普通正則怎麼寫?
import re
re.compile('(?:(?:0x|0X)[0-9a-f]+)|(?:(?:0x|0X)[0-9A-F]+)|(?:[0-9a-f]+)|(?:[0-9A-F]+)')
感覺可讀性怎麼樣?
那如果這時候換成 Humre 呢?就可以這樣寫:
from humre import *
compile(
either(
noncap_group(noncap_group(either('0x', '0X')), one_or_more(chars('0-9a-f'))),
noncap_group(noncap_group(either('0x', '0X')), one_or_more(chars('0-9A-F'))),
noncap_group(one_or_more(chars('0-9a-f'))),
noncap_group(one_or_more(chars('0-9A-F')))
)
)
是不是清晰多了? either
指的就是其中某一個符合條件就可以,然後傳入了四個引數, noncap_group
指的就是將內容看作一個整體來匹配, one_or_more
指的就是一個或更多,這樣我們就可以清晰地知道這個正則表示式什麼含義了。
再來一個例子,匹配一個帶或不帶逗號的數字,並且可以匹配小數點,那麼普通正則就這樣寫:
import re
re.compile(r'(?:\+|-)?(?:(?:\d{1,3}(?:,\d{3})+)|\d+)(?:\.\d+)?')
顫抖吧!估計正則專家都不一定一眼讀出來這是啥意思,有沒有錯誤。
那用 Humre 怎麼寫呢?
from humre import *
compile(
# optional negative or positive sign:
optional(noncap_group(either(PLUS_SIGN, '-'))),
# whole number section:
noncap_group(either(
# number with commas:
noncap_group(between(1, 3, DIGIT), one_or_more(noncap_group(',', exactly(3, DIGIT)))),
# number without commas:
one_or_more(DIGIT)
)),
# fractional number section (optional)
optional(noncap_group(PERIOD, one_or_more(DIGIT)))
)
是不是又清晰了?
這裡一共拆分為了三部分,正負號、數字、小數點,其中正負號和小數點都是可選的,所以可以加一個 optional
, noncap_group
照例還是整體匹配,然後有一些常量 PLUS_SIGN
就可以代表加號, between
就可代表從幾到幾。整體這麼一拆分,並添加註釋和分級,是不是可讀性就大大增強了?
OK,到這裡,體會到 Humre 的便捷之處了吧~
Humre 真的有必要嗎?
在我看來,使用正則的人可能有兩種:一種是剛不怎麼會剛入門的,另一種是精通正則的。
如果是剛入門的,那有了 Humre,我們其實可以不用過多關心正則的很多語法,上手起來就會快很多。
如果是精通正則了,那麼其實可以很快寫出來某個功能需求的正則表示式,這個沒問題。
但寫出來之後,如果遇到問題了想要排查,那其實還得費點功夫,
當然排查過程也可以藉助於很多優秀的正則表示式輔助工具,比如:
-
https://regexr.com/
-
https://regex101.com/
所以排查問題還好。
但到了維護階段,或者專案被別人來維護了,不管是自己還是別人,看到這個正則表示式想看出是什麼意思,那其實就不太好辦了。
所以,這種語義化的正則不論對於正則小白還是專家,都是有一定幫助的。
語義化表
瞭解了 Humre 的基本功能之後,如果我們想要使用它的話,其實就是找到它的一些 API 功能就好了,比如 optional
, nocap_group
等等都什麼意思,對應正則表示式的什麼功能,這裡總結了一些常用的方法和含義:

另外還有一些常量表示如下:

另外 Humre 還提供了一些常用的表達,比如十六進位制 HEXADECIMAL
,參考如下:

這裡簡單列一下,但最新的 API 建議還是參考官方文件: https://github.com/asweigart/humre#quick-reference
後面需要做什麼?用這個庫上手寫幾個,感受一下,練上幾個就熟練了。
提示
當然,這個庫好用是好用的,但距離成熟可能還有一點時間哈,在 1.0 版本之前,其中的 API 可能還會迭代,所以還不建議直接上生產環境。
如果真的要上生產環境,建議鎖死版本號,避免帶來潛在的問題。
總結
好了,這裡主要就是給大家介紹下這個正則庫,有了它,我們的正則表示式就可以變得更加清晰易讀,希望對大家有幫助~

End
崔慶才的新書 《Python3網路爬蟲開發實戰(第二版)》 已經正式上市了!書中詳細介紹了零基礎用 Python 開發爬蟲的各方面知識,同時相比第一版新增了 JavaScript 逆向、Android 逆向、非同步爬蟲、深度學習、Kubernetes 相關內容,同時本書已經獲得 Python 之父 Guido 的推薦,目前本書正在七折促銷中!
內容介紹: 《Python3網路爬蟲開發實戰(第二版)》內容介紹
掃碼購買
好文和朋友一起看~
- 有了這個庫,以後再也不用寫正則表示式了!
- 推薦 GitHub 上的一套公開 API 介面,簡直不要太全!
- 乾貨丨用相似度演算法分析和解決字型反爬問題
- 推薦一個好用的圖片壓縮網站!清晰度不變的同時體積減小一大半
- 谷歌驗證碼 ReCAPTCHA 的模擬點選破解方案來了!
- 爬蟲 JavaScript 逆向進階!利用 AST 技術還原混淆程式碼
- 一個令人讚不絕口的抓包神器!
- 丨JavaScript 逆向過程中無限 Debug 的繞過方案
- 這個好玩!分享幾個爬蟲“逆向破解”的練手專案
- 百度又釋出一個神器!網友直呼好傢伙
- 大手筆!微軟一口氣在 GitHub 開源了 4 個技術教程
- 滾蛋吧,正則表示式!
- 俄羅斯最大的盜版資源網站,解封了!
- 給大家推薦一個強大易用的爬蟲智慧列表解析外掛!
- 清華博士導師整理:Tensorflow 和 Pytorch 的筆記(包含經典專案實戰)
- 這可能是你見過最全的網路爬蟲工具庫集合!
- 一個神器,大幅提升爬蟲爬取效率!
- 分享一個開源免費、功能強大的視訊播放器庫
- 好用且能兼職賺錢的自動化工具 - Hamibot!
- 用 Markdown 做的 PPT,真的太強了!