一日一技:讓你的正則表達式可讀性提高一百倍
正則表達式這個東西,強大是強大,但寫出來跟個表情符號一樣。自己寫的表達式,過一個月來看,自己都不記得是什么意思了。比如下面這個:
pattern = r"((?:\(\s*)?[A-Z]*H\d+[a-z]*(?:\s*\+\s*[A-Z]*H\d+[a-z]*)*(?:\s*[\):+])?)(.*?)(?=(?:\(\s*)?[A-Z]*H\d+[a-z]*(?:\s*\+\s*[A-Z]*H\d+[a-z]*)*(?:\s*[\):+])?(?![^\w\s])|$)"
有沒有什么辦法提高正則表達式的可讀性呢?我們知道,提高代碼可讀性的方法之一就是寫注釋,那么正則表達式能不能寫注釋呢?
例如對于下面這個句子:
msg = '我叫青南,我的密碼是:123kingname456,請注意保密。'
我要提取其中的密碼123kingname456,那么我的正則表達式可能是這樣的:
pattern = ':(.*?),'
我能不能把它寫成這樣:
pattern = '''
: # 開始標志
(.*?) #從開始標志的下一個字符開始的任意字符
, #遇到英文逗號就停止
'''
這樣寫就清晰多了,每個部分是什么作用全都清清楚楚。
但顯然直接使用肯定什么都提取不到,如下圖所示:
但我今天在逛Python正則表達式文檔的時候,發(fā)現(xiàn)了一個好東西:
使用它,可以讓你的正則表達式擁有注釋,如下圖所示:
re.VERBOSE?也可以簡稱為re.X,如下圖所示:
本文最開頭的復(fù)雜正則表達式,使用了注釋以后,就會變得更可讀:
pattern = r"""
( # code (capture)
# BEGIN multicode
(?: \( \s* )? # maybe open paren and maybe space
# code
[A-Z]*H # prefix
\d+ # digits
[a-z]* # suffix
(?: # maybe followed by other codes,
\s* \+ \s* # plus-separated
# code
[A-Z]*H # prefix
\d+ # digits
[a-z]* # suffix
)*
(?: \s* [\):+] )? # maybe space and maybe close paren or colon or plus
# END multicode
)
( .*? ) # message (capture): everything
(?= # up to (but excluding)
# the next code
# BEGIN multicode
(?: \( \s* )? # maybe open paren and maybe space
# code
[A-Z]*H # prefix
\d+ # digits
[a-z]* # suffix
(?: # maybe followed by other codes,
\s* \+ \s* # plus-separated
# code
[A-Z]*H # prefix
\d+ # digits
[a-z]* # suffix
)*
(?: \s* [\):+] )? # maybe space and maybe close paren or colon or plus
# END multicode
# (but not when followed by punctuation)
(?! [^\w\s] )
# or the end
| $
)
"""