正則表達式
分類
BRE:基本正則表達式,grep,sed,vi等軟件支持,vim有擴展
ERE:擴展正則表達式,egrep,grep -E ,sed ?r等
PCRE:幾乎所有的高級語言都是PCRE的方言或則變種,
基本語法
元字符metacharater
. ?匹配除換行符外任意一個字符
[abc]字符集合,只能表示一個字符的位置,匹配所包含的任意一個字符,[abc]匹配plain的a
[^abc] 字符集合,只能表示一個字符的位置。匹配除集合內的。
[a-z]字符范圍,也是個集合,表示一個字符位置,匹配所包含的任意一個字符
[^a-z]字符范圍,除去集合所包含的
\b單詞的邊界 \bb在文本中找到單詞b開頭的b字符
\B不匹配單詞的邊界,
\d 匹配一位0-9的數字
\D匹配一位0-9非數字
\s匹配一位空白字符[\f\r\t\n\v]
\S匹配一位非空白字符
\w匹配[0-9A-Za-z]包括中文字符
\W匹配除\w之外的字符
轉義
凡是在正則表達式中油特殊含義的符號,如果想使用它的本意,請使用\轉義。反斜線自身得使用\\
\r\n還是轉義后代表回車換行
重復
*表示前面的正則表達式會重復0次:e\w*單詞中e后面可以有非空白字符
+表示前面的正則表達式至少重復一次:e\w+單詞中e后面只至少有一個非空白字符
?表示前面的正則表達式會重復0次或則一次:e\w? 單詞中e后面至多有一個非空白字符
{n}重復固定的n次:
{n,}至少重復n次
{n,m}重復n到m次
X|y ?匹配x或者y
(pattern) 使用小括號指定一個子表達式,也叫分組,可以改變優先級
\數字 ?匹配對應的分組
(?:pattern)如果僅僅為了了改變優先級,就不需要分組
(?<name>exp)(?’name’exp)分組捕獲,但是可以通過name訪問分組Python語法必須是(?<name>exp)
(?=exp)零寬度正預測先行斷言,斷言exp一定在匹配的右邊出現,也就是說斷言后邊一定跟個exp
零寬度正回顧后發斷言,斷言exp一定出現在匹配的左邊出現,也就是說前面一定有個exp前綴
(?!exp)零寬度負預測先行斷言,斷言exp一定不會出現在右側,也就是說斷言后面一定不會出現exp
(?<!exp)零寬度負回顧后發斷言,斷言exp一定不能出現在左側,也就是說斷言前面一定不能是exp
(?#comment) 注釋 f(?=00)(?#這個后斷言不捕獲)
注意:
斷言會不會捕獲呢?也就是斷言會不會占用分組號呢
斷言不會占用分組號,斷言如同條件,只是要求匹配必須瞞足斷言的條件
?
分組和捕獲不是同一個意思
使用正則表達式,能用簡單表達式,就不要用復雜的表達式
?
貪婪豫非貪婪
默認是貪婪模式,也就是說盡量匹配更長的子串
非貪婪很簡單,再重復的符號后面加上一個?就盡量的少匹配了
引擎選項
Ignorecase 匹配時忽略大小寫 re.l
Singleline 單行模式。可以匹配所有字符,包括\n re.S
Multiline 多行模式^行首 $行尾 re.M
lgnorePatternwhitespace 忽略表示中的空白字符,如果要使用空白字符,如果要是用空白字符用轉義,#可以用來做注釋 re.X
編譯
re.compile(pattern,flags=0)
設定flags,編譯模式,返回正則表達式對象regex
Pattern就是正則表達式字符串,flags是選項,正則表達式需要被編譯,為了提高效率,這些編譯后的結果被保存,下次使用同樣的pattern的時候,就不需要再次編譯。
re的其他方法為了提高效率調用的編譯方法。就是為了提速
Re.match(pattern,string,flags=0)
match匹配從字符串的開頭匹配,regex對象match方法可以重設定開始位置和結束位置。返回match對象
re.search(pattern,string,flags=0)
從開頭搜索直到第一個匹配,reges對象search方法可以重設開始位置和結束位置,返回match對象
re.fullmatch(pattern.string,flags=0)
Regex.fullmatch(string[,pos[,endpos]])
整個字符串和正則表達式匹配
re.findall(pattren,string,flags=0)
Regex.findall(string[,pos[,endpos]])
對整個字符串,從左到右匹配,返回所有匹配項的列表
re.finditer(pattren.string,flags=0)
Regex.finditer(string,[,pos[,endpos]])
對整個字符串,從左至右匹配,返回所有的匹配項,返回迭代器
注意每次迭代返回的是match對象。
re.sub(pattern,replacement,string,count=0,flags=0)
Regex.sub(replacement,string,count=0)
使用pattern對字符串string進行匹配,對匹配選項使用repl替換,可以是子串,寒素,bytes
分割字符串
字符串的分割函數,太難用,不能指定多個字符串進行分割
re.split(pattern,string,maxsplit=,flags=0)
re.split分割字符串
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/97675