正則表達式

##**正則表達式**
– 正則表達式是文本處理極為重要的技術,用它可以對字符串按照某種規則進行檢索、替換
– 分類:
– BRE:基本正則表達式,grep sed vi等軟件支持。vim有擴展
– ERE:擴展正則表達式,egrep(grep -E) sed -r等
– PCRE:幾乎所有高級語言都是PCRE的方言或者變種。

##**基礎語法**
– “.” : 匹配除換行符外任意一個字符
– [abc] : 字符集合,匹配所包含的任意一個字符
– [^abc] : 字符集合,只能表示一個字符位置。匹配除去集合內字符的任意一個字符
– [^a-z] : 字符范圍,也是集合,表示一個字符位置,匹配除去集合內字符的任意一個字符
– \b : 匹配單詞的邊界 舉例:\bb在文本中找到單詞b開頭的b字符
– \B : 不匹配單詞的邊界 舉例:t\B 包含t但不以t結尾,如write; \Bb不以b開頭的含有b的單詞,例如able
– \d : [0-9]匹配一位單詞
– \D :[^0-9]匹配一位非數字
– \s : 匹配1位空白字符,包括換行符、制表符、空格
– \S : 匹配1位非空白字符
– \w : 匹配[a-zA-Z0-9_],包括中文的字,不包括空格
– \W : 匹配\w之外的字符

###**單行模式,多行模式**
– 單行模式
– .可以匹配所有字符,包括換行符
– ^表示整個字符串的開頭,$整個字符串的結尾
– 多行模式
– .可以匹配除了換行符之外的字符
– ^表示行首,$行尾
– 開始指\n后緊接著下一個字符,結束指的是\n前的字符

###**轉義**
– 凡是在正則表達式中有特殊意義的符號,如果想使用它的本意,請使用\轉義。反斜杠自身,得使用\\
– \r \n還是轉義后代表回車、換行

##**重復**
| 代碼 | 說明 | 舉例 |
| :————-|:——————————|:—————————–|
| * |表示前面的正則表達式重復0或多次|e\w *單詞中有e然后后面非空白字符
| + |重復至少1次 |e\w+ 單詞e后面至少有一個非空白字符
| ? |重復0或1次 |e\w? 單詞e后至多有一個非空白字符
| {n} |重復固定的n次 |e\w{1} 單詞中e后面只能有一個非空白字符
| {n,} |重復至少n次 |
| {n,m} |重復n到m次 |e\w{1,10}單詞中e后面至少1個,至多10個
| x丨y |匹配x或者y |(w丨f)ood
| 捕獲 |(pattern) |捕獲后分配組號從1開始
| \數字 |匹配對應的分組 |(very) \1 匹配very very,捕獲的組group是very
| (?:pattern) |如果改變優先級就不需要捕獲分組 |(?:w丨f)ood
|(?<name>exp) |分組捕獲,通過\name訪問分組 |
| (?=exp) |斷言exp一定在右邊出現 |f(?=oo) f后面一定有oo出現
| (?<=exp) |exp左邊一定出現 |
| (?!exp) |斷言后面一定不是exp |\d{3}(?!\d) 3個數字后面一定不是數字
| (?<!exp) |斷言exp一定不再左邊出現 |(?<!f)ood 就是ood左邊一定不是f
| (?#comment) |注釋 |f(?=oo)(?#這個后斷言不捕獲)

##**貪婪與非貪婪**
– 默認是貪婪模式,也就是說盡量多匹配更長的字符串
– 非貪婪模式在重復的符號后面加上一個?問號,變少匹配了
| 代碼 | 說明 | 舉例 |
| :————-|:——————————|:—————————–|
| *? |匹配任意次,盡可能少重復 |
| +? |匹配至少1次,但盡可能少重復 |
| ?? |匹配0次或1次,少重復 |
| {n,}? {n,m}? |少重復

##**練習**
1.匹配手機號碼:
\d{11}
2.匹配座機
\d{3,4}-\d{7,8}
3.匹配0-999之間的數字
一位數:\d 兩位數:[1-9]?\d 三位數:^([1-9]\d\d?|\d)\r?$
4.匹配ip地址 0.0.0.0 – 255.255.255.255
(?:([01]?\d\d?|25[0-5]|2[0-4]\d)\.){3}([01]?\d\d?|25[0-5]|2[0-4]\d)

##**python的正則表達式**
– **常量**
– re.M re.MULTILINE 多行模式
– re.S re.DOTALL 單行模式
– re.I re.IGNORECASE 忽略大小寫
– re.X re.VERBOSE 忽略表達式中的空白字符

– **編譯**
– re.compile(pattern,flags=0) #flags如 re.I re.M re.S
– 設定flags,編譯模式,返回正則表達式對象regex
– pattern是正則表達式字符串,flags是選項。正則表達式需要被編譯,結果保存,下次便不需要再編譯
– 單次匹配(match)
– re.match(pattern,string,flags=0)
– regex.match(string[,pos[,endpos]])
– match是從字符串開頭匹配,regex對象match方法可以重設定開始位置和結束位置。
– 單次匹配(search)
– re.search(pattern,string,flags=0)
– regex.search(string[,pos[,endpos]])
– 從頭搜索直到第一個匹配,regex對象search方法可以重設定開始位置和結束位置,返回match對象
– 單次匹配(fullmatch)
– re.fullmatch(pattern,string,flags=0)
– regex.fullmatch(string[,pos[,endpos]])
– 整個字符串和正則表達式匹配
– 全部匹配(findall)
– re.findall(pattern,string,flags=0)
– regex.findall(string[,pos[,endpos]])
– 對整個字符從左至右匹配,返回所有匹配項的**列表**
– 全部匹配(finditer)
– re.finditer(pattern,string,flags=0)
– regex.finditer(string[,pos[,endpos]])
– 對整個字符串,從左至右匹配,返回所有匹配項,返回**迭代器**

###**匹配替換,分割字符串**
– 匹配替換
– re.sub(pattern,replacement,string,count=0,flags=0)
– regex.sub(replacement,string,count=0)
– 使用pattern對字符串string進行匹配,對匹配項使用repl替換;replacement可以是string bytes function
– re.subn(pattern,replacement,string,count=0,flags=0)
– regex.subn(replacement,string,count=0)
– 同sub返回一個元組(new_string,number_of_subs_made) number_of_subs_made指替換次數

– 分割字符串
– re.split(pattern,string,maxsplit=0,flags=0) 返回一個分割后的列表
##例子
import re
s = ”’01 bottle
02 bag
03 big1
100 able”’
result = re.split(‘[\s\d]+’,s)
print(result) #[”,’bottle’,’big’,’able’]

regex = re.compile(‘^[\s\d]+’,re.M)
result = regex.split(s)
print(result) #[”,’bottle\n’,’bag\n’,’big1\n’,’able’]

##**分組**
– 使用小括號的pattern捕獲的數據被放到了組group中
– match、search函數可以返回match對象;findall返回字符串列表;finditer返回一個個match對象
###練習
import re
s = ”’bottle\nbag\nbig\napple”’
regex = re.compile(‘(b\w+)\n(?P<name2>b\w+)\n(?P<name3>b\w+)’)
result = regex.match(s)
print(result.groups()) (‘bottle’,’bag’,’big’)
print(result.group(0)) ‘bottle\nbag\nbig’
print(result.group(1)) ‘bottle’
print(result.group(2)) ‘bag’
print(result.groupdict()) {‘name2′:bag,’name3’:big}
print(result.group(‘name2’)) ‘bag’

 

 

 

 

 

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/88247

(0)
miraclermiracler
上一篇 2017-11-07 09:33
下一篇 2017-11-08 18:45

相關推薦

  • issue設置和定時關機練習

    /etc/issue內的代碼意義 \l 顯示第幾個終端機接口(tty)\m 顯示硬件的等級 (x86_64)\n 顯示主機的網絡名稱 (zcl-domain)\r 操作系統的版本 (2.6.32-642.e16)\t 顯示本地端時間的時間(20:22:12) \d顯示本地端的日期 (2016-8-5)\s 操作系統的名稱(linux)  練習 1,…

    Linux干貨 2016-08-05
  • 為你的網絡傳輸加把鎖(OpenSSL)

    互聯網形成的初期,更多關注的是設備之間通過網絡相互訪問功能的實現,我們都知道,兩個設備之間要想相互通信,就必需遵循某種協議,于是早期的互聯網也出現來眾多的協議,比如傳輸層最著名的協議就是tcp和udp,而應用層比較著名的協議有:http、ftp、pop、smtp、dns、telnet等等,而這些協議這開發初期,更多是關注功能的實現,數據這網絡上傳輸是明文方式…

    Linux干貨 2015-12-06
  • 馬哥教育網絡班22期+第5周課程練習 忍者亂太郎喻成

    1、顯示當前系統上root、fedora或user1用戶的默認shell;   以root為例 awk -F':' '$1 ~ /root/ {print $7} ' /etc/passwd 2、找出/etc/rc.d/…

    Linux干貨 2016-10-09
  • CentOS下獲取幫助

    CentOS中獲取幫助 在使用和學習CentOS系統時,我們可能會遇上不熟悉的命令,需要獲取幫助。在很多情況下,我們無法通過網絡獲取幫助,這個時候我們就需要自己通過查看系統幫助文檔來解決問題。下面就來介紹獲取幫助的方法: 1、 獲取簡單的幫助信息:whatis COMMAND   2、獲取比較詳細的命令幫助信息:help COMMAND;COMMA…

    2017-07-15
  • echo命令使用詳解

        echo命令用于在shell中打印shell變量的值,或者直接輸出指定的字符串。linux的echo命令,在shell編程中極為常用,在終端下打印變量的時候也是常常用到的,因此有必要了解下echo的用法。 語法: ? 語法: echo [-neE][字符串]   命令選項:   &…

    Linux干貨 2016-08-22
  • 特殊權限

    特殊權限 文件特殊權限 一、SUID(4) SUID:當s這個標志出現在文件所有者的x權限上時,就被稱作SUID。 SUID的功能和限制:1、僅僅對二進制程序有效; 2、執行者對程序需要X的執行權限; 3、本權限僅僅在執行該程序的過程中有效; 4、執行者將具有該程序所有者的權限。 5、SUID僅僅可以用在二進制程序上,…

    Linux干貨 2016-08-05
欧美性久久久久