心塞的兩件事
- 文章排版
由于實在無法忍受微信公眾號的默認(rèn)排版方式,調(diào)整字體麻煩不說适肠,修改一下字體霍衫,還會影響到代碼高亮。
忍無可忍侯养,昨天通過markdown轉(zhuǎn)html配上css的裝飾代碼進行排版敦跌,以后寫完文莊轉(zhuǎn)化后直接發(fā)就好了。
本來覺得挺不錯的效果逛揩,今天朋友說整體風(fēng)格充斥這一種城鄉(xiāng)結(jié)合部的氣息柠傍。聽到這話,我感覺...以后文章要火息尺!畢竟毛爺爺說的好携兵,農(nóng)村包圍城市,武裝奪取政權(quán)... 誰幫我給農(nóng)民伯伯們推薦一下我城鄉(xiāng)結(jié)合部氣質(zhì)的公眾號,哈哈搂誉。
- 公眾號留言
早上朋友說徐紧,為什么我公眾號發(fā)的文章不能留言,我還以為是因為粉絲太少,所以沒權(quán)限并级。晚上查了才知道拂檩,18年3月后申請的公眾號,都不能留言...不開心嘲碧。大家如果有什么想和我交流的稻励,可以在公眾號底部的==關(guān)于清風(fēng)==中添加我的微信,或者私信我都行...
今天講什么愈涩?
今天以為大學(xué)同學(xué)微信聊望抽,說最近在看我的公眾號,她是國企汽車制造業(yè)的履婉,但也要用python進行數(shù)據(jù)分析...之前看了往期的python字符串操作內(nèi)容煤篙,里面說到了正則表達(dá)式,想學(xué)習(xí)一下...
正則表達(dá)式這東西毁腿,你說它簡單它也簡單辑奈,你說它難吧,確實不容易已烤。為什么鸠窗?這東西就是死記硬背的。背過了相關(guān)的語法胯究,使用起來就so easy稍计。但記不熟語法,就犯難了唐片。網(wǎng)上關(guān)于python正則的帖子很多丙猬,我再去寫壓力比較大,盡可能的總結(jié)詳細(xì)一些吧费韭!
正則表達(dá)式簡介
正則表達(dá)式,是一個特殊的字符序列庭瑰,又稱規(guī)則表達(dá)式(英語:Regular Expression星持,在代碼中常簡寫為regex、regexp 或RE)弹灭,本質(zhì)而言是一種小型的督暂,高度專業(yè)化的編程語言。
Python 自1.5版本起增加了re 模塊穷吮,re 模塊使Python語言擁有全部的正則表達(dá)式功能逻翁。
正則語法表
關(guān)于正則語法表,別想其他的都背過就行了捡鱼。不管你是python還是其他的語言都是一樣的八回,所以背不過就抄到記住為止!這個你背不過,再好的教程看了也沒用缠诅。如何巧記溶浴?我們需要對其進行分類。
- 開頭結(jié)尾
這一對標(biāo)簽管引,大家都不會陌生...
模式 | 描述 |
---|---|
^ | 從整個字符串開頭的地方匹配 |
$ | 從整個字符串的結(jié)尾開始匹配 |
- 模糊匹配
模式 | 描述 |
---|---|
. | 匹配任意字符士败,除了換行符 |
re? | 重復(fù)匹配?號前面0個或1個由前面的正則表達(dá)式定義的片段,非貪婪方式 |
re* | 重復(fù)匹配*號前面0個或多個的表達(dá)式褥伴。 |
re+ | 重復(fù)匹配+號前面1個或多個的表達(dá)式谅将。 |
a丨b | 匹配a或b |
- 關(guān)于括號
模式 | 描述 |
---|---|
{} | 表示匹配"{}"前邊的字符 指定個數(shù)為"{}"里邊的數(shù)值 |
[] | 表示一個字符集,它常被用來指定一個字符類別重慢,字符可以單個列出饥臂,也可以用“-”號分隔的兩個給定字符來表示一個字符區(qū)間 |
() | 分組 將括號中的內(nèi)容 當(dāng)作整體來對待 |
- "" 反斜杠的應(yīng)用
模式 | 描述 |
---|---|
\w | 匹配字母數(shù)字及下劃線 |
\W | 匹配非字母數(shù)字及下劃線 |
\s | 匹配任意空白字符,等價于 [\t\n\r\f]. |
\S | 匹配任意非空字符 |
\d | 匹配任意數(shù)字伤锚,等價于 [0-9]. |
\D | 匹配任意非數(shù)字 |
\A | 匹配字符串開始 |
\Z | 匹配字符串結(jié)束擅笔,如果是存在換行,只匹配到換行前的結(jié)束字符串屯援。 |
\z | 匹配字符串結(jié)束 |
\G | 匹配最后匹配完成的位置猛们。 |
\b | 匹配一個單詞邊界,也就是指單詞和空格間的位置狞洋。例如弯淘, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'吉懊。 |
\B | 匹配非單詞邊界庐橙。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'借嗽。 |
\n, \t, 等. | 匹配一個換行符态鳖。匹配一個制表符。等 |
\1...\9 | 匹配第n個分組的內(nèi)容恶导。 |
\10 | 匹配第n個分組的內(nèi)容浆竭,如果它經(jīng)匹配。否則指的是八進制字符碼的表達(dá)式惨寿。 |
- 其他
模式 | 描述 |
---|---|
(?imx) | 正則表達(dá)式包含三種可選標(biāo)志:i, m, 或 x 邦泄。只影響括號中的區(qū)域。 |
(?-imx) | 正則表達(dá)式關(guān)閉 i, m, 或 x 可選標(biāo)志裂垦。只影響括號中的區(qū)域顺囊。 |
(?: re) | 類似 (...), 但是不表示一個組 |
(?imx: re) | 在括號中使用i, m, 或 x 可選標(biāo)志 |
(?-imx: re) | 在括號中不使用i, m, 或 x 可選標(biāo)志 |
(?#...) | 注釋. |
(?= re) | 前向肯定界定符。如果所含正則表達(dá)式蕉拢,以 ... 表示特碳,在當(dāng)前位置成功匹配時成功诚亚,否則失敗。但一旦所含表達(dá)式已經(jīng)嘗試测萎,匹配引擎根本沒有提高亡电;模式的剩余部分還要嘗試界定符的右邊。 |
(?! re) | 前向否定界定符硅瞧。與肯定界定符相反份乒;當(dāng)所含表達(dá)式不能在字符串當(dāng)前位置匹配時成功 |
(?> re) | 匹配的獨立模式,省去回溯腕唧。 |
re模塊用法
re.(function)(pattern[, flags])
pattern : 一個字符串形式的正則表達(dá)式
flags : 可選或辖,表示匹配模式,比如忽略大小寫枣接,多行模式等颂暇,具體參數(shù)為:
- re.I 忽略大小寫
- re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴于當(dāng)前環(huán)境
- re.M 多行模式
- re.S 即為 . 并且包括換行符在內(nèi)的任意字符(. 不包括換行符)
- re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴于 Unicode 字符屬性數(shù)據(jù)庫
- re.X 為了增加可讀性,忽略空格和 # 后面的注釋
- findall() (即:全部找到,返回的是一個列表)
findall(string[, pos[, endpos]])
參數(shù):
- string : 待匹配的字符串但惶。
- pos : 可選參數(shù)耳鸯,指定字符串的起始位置,默認(rèn)為 0膀曾。
- endpos : 可選參數(shù)县爬,指定字符串的結(jié)束位置,默認(rèn)為字符串的長度添谊。
import re
s = 'helloworld hellobeijing'
ret = re.findall('hello\S+',s)
print(ret)
['helloworld', 'hellobeijing']
- finditer()
和 findall 類似财喳,在字符串中找到正則表達(dá)式所匹配的所有子串,并把它們作為一個迭代器返回斩狱。
re.finditer(pattern, string, flags=0)
參數(shù):
參數(shù) | 描述 |
---|---|
pattern | 匹配的正則表達(dá)式 |
string | 要匹配的字符串耳高。 |
flags | 標(biāo)志位,用于控制正則表達(dá)式的匹配方式所踊,如:是否區(qū)分大小寫泌枪,多行匹配等等 |
- search() 與 match()
相同點:
語法:re.search/match(pattern, string, flags=0)
函數(shù)參數(shù)說明:
參數(shù) | 描述 |
---|---|
pattern | 匹配的正則表達(dá)式 |
string | 要匹配的字符串。 |
flags | 標(biāo)志位秕岛,用于控制正則表達(dá)式的匹配方式工闺,如:是否區(qū)分大小寫,多行匹配等等 |
- 可以使用group(num) 或 groups() 匹配對象函數(shù)來獲取匹配表達(dá)式瓣蛀。
匹配方法 | 描述 |
---|---|
group(num=0) | 匹配的整個表達(dá)式的字符串,group() 可以一次輸入多個組號雷厂,在這種情況下它將返回一個包含那些組所對應(yīng)值的元組 |
groups() | 返回一個包含所有小組字符串的元組惋增,從 1 到 所含的小組號 |
start([group]) | 方法用于獲取分組匹配的子串在整個字符串中的起始位置(子串第一個字符的索引),參數(shù)默認(rèn)值為 0 |
end([group]) | 方法用于獲取分組匹配的子串在整個字符串中的結(jié)束位置(子串最后一個字符的索引+1)改鲫,參數(shù)默認(rèn)值為 0 |
span([group]) | 方法返回 (start(group), end(group) |
import re
# re.search
ret = re.search('h..','hello hello world')
print(ret) # 輸出結(jié)果:<_sre.SRE_Match object; span=(0, 3), match='hel'>
ret1 = re.search('h..','hello hello world').group()
print(ret1) # 輸出結(jié)果:hel 只輸出第一個符合條件的結(jié)果
# re.match
ret = re.match('asd','asdhskdjfksji')
print(ret) # 輸出結(jié)果:<_sre.SRE_Match object; span=(0, 3), match='asd'>返回的是一個對象诈皿。
ret1 = re.match('asd','asdhskdjfasdksjiasd').group()
print(ret1) # 輸出結(jié)果:asd 調(diào)用.group()方法林束,只返回匹配的第一個結(jié)果。
不同點:
- re.match只匹配字符串的開始稽亏,如果字符串開始不符合正則表達(dá)式壶冒,則匹配失敗,函數(shù)返回None
- re.search匹配整個字符串截歉,直到找到一個匹配
# re.search
s = 'helloworld hellobeijing'
ret = re.search('hellob\S+',s)
print(ret)
<re.Match object; span=(11, 23), match='hellobeijing'>
# re.match
s = 'helloworld hellobeijing'
ret = re.match('hellob\S+',s)
print(ret)
None
- split() 分隔符 對比字符串里邊的split方法胖腾。
split 方法按照能夠匹配的子串將字符串分割后返回列表,它的使用形式如下:
re.split(pattern, string[, maxsplit=0, flags=0])
參數(shù) | 描述 |
---|---|
pattern | 匹配的正則表達(dá)式 |
string | 要匹配的字符串瘪松。 |
maxsplit | 分隔次數(shù)咸作,maxsplit=1 分隔一次,默認(rèn)為 0宵睦,不限制次數(shù)记罚。 |
flags | 標(biāo)志位,用于控制正則表達(dá)式的匹配方式壳嚎,如:是否區(qū)分大小寫桐智,多行匹配等等。參見:正則表達(dá)式修飾符 - 可選標(biāo)志 |
import re
s = 'helloworld hellobeijing'
ret = re.split('hello',s)
print(ret)
['', 'world ', 'beijing']
- sub() 替換烟馅;類似字符串中的replace()方法说庭。
re.sub用于替換字符串中的匹配項。
語法:
re.sub(pattern, repl, string, count=0, flags=0)
參數(shù):
- pattern : 正則中的模式字符串焙糟。
- repl : 替換的字符串口渔,也可為一個函數(shù)。
- string : 要被查找替換的原始字符串穿撮。
- count : 模式匹配后替換的最大次數(shù)缺脉,默認(rèn) 0 表示替換所有的匹配。
import re
s = 'helloworld hellobeijing'
ret = re.sub('hello','goodbye',s)
print(ret)
goodbyeworld goodbyebeijing
- compile(strPattern[,flag]): 這個方法是Pattern類的工廠方法悦穿,用于將字符串形式的正則表達(dá)式編譯為Pattern對象
compile 函數(shù)用于編譯正則表達(dá)式攻礼,生成一個正則表達(dá)式( Pattern )對象,供 match() 和 search() 這兩個函數(shù)使用栗柒。
語法格式為:
re.compile(pattern[, flags])
參數(shù):
pattern : 一個字符串形式的正則表達(dá)式
- flags : 可選礁扮,表示匹配模式,比如忽略大小寫瞬沦,多行模式等太伊,具體參數(shù)為:
- re.I 忽略大小寫
- re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴于當(dāng)前環(huán)境
- re.M 多行模式
- re.S 即為 . 并且包括換行符在內(nèi)的任意字符(. 不包括換行符)
- re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴于 Unicode 字符屬性數(shù)據(jù)庫
- re.X 為了增加可讀性,忽略空格和 # 后面的注釋
import re
pattern = re.compile('he.{3}')
pattern.match(s)
<re.Match object; span=(0, 5), match='hello'>
The End
OK,今天的內(nèi)容就到這里逛钻,如果覺得內(nèi)容對你有所幫助僚焦,可以點擊文章右下角的“在看”。
==歡迎將這篇文章或我的微信公眾號【清風(fēng)Python】分享給更多喜歡python的人曙痘,謝謝芳悲。==