Python正則表達式

正則表達式(Regular expression)是組成搜索模式的一組字符序列,是記錄文本規則的代碼,用來檢查文本中是否包含指定模式的字符串,經過定義一個規則來匹配字符串。正則表達式普遍應用於在字符串查找和處理中,大多文本編輯器基本都支持正則表達式查找。本文將簡要介紹正則表達式語法,而後介紹Python語言中正則表達式使用方法。html

正則表達式

Unix之父Ken Tompson將正則表達式引入Unix,後面發展成了grep(Global Regular Expression Print)命令,因爲grep不支持+|? ,且分組比較麻煩,AT&T的Alfred Aho開發了egrep命令。隨着Unix的版本不斷演化,Unix中的程序(好比Linux三劍客中的awk、sed)所支持的正則表達式有差別,比較混亂。在1986年制定了POSIX(Portable Operating System Interface)標準,其中統一了正則表達式的語法。python

POSIX標準把正則表達式分爲兩種:BRE(Basic Regular Expressions)和ERE(Extended Regular Expressions )。BRE就是unix系統使用的grep命令,ERE對應egrep命令,是BRE的擴展。而linux系統使用的是GNU標準,linux發行版集成了GNU(Gnu’s Not Unix)套件,GNU在實現了POXIS標準的同時,作了必定的擴展。也包括GNU Basic Regular Expressions 和GNU Extends Regular Expressions。linux

正則表達式除了POSIX標準以外還有一個Perl分支,Perl與sed和awk兼容,後來演化成爲PCRE(Perl Compatible Regular Expressions),是一個用C語言編寫的正則表達式函數庫,功能很強大,性能比POSIX正則表達式好。PCRE被引入了其餘語言中,好比PHP, Tcl, Python, Ruby, C++, Java, R語言等等。nginx

普通正則

代碼 說明
. 匹配除換行符之外的任意字符
\w 匹配字母或數字或下劃線或漢字
\s 匹配任意的空白符
\d 匹配數字
\b 匹配單詞的開始或結束
^ 匹配字符串的開始
$ 匹配字符串的結束
* 重複零次或更屢次

擴展正則

擴展正則:grep加 -E 參數git

  • grep -E ' 404 | 500' nginx.log
代碼/語法 說明
+ 重複一次或更屢次
重複零次或一次
{n} 重複n次
{n,} 重複n次或更屢次
{n,m} 重複n到m次
| 表示或

零寬斷言

語法 說明
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp後面的位置
(?!exp) 匹配後面不是exp的位置
(?<!exp) 匹配前面不是exp的位置

正則表達式實例

正則表達式在線測試工具:github

  1. https://regex101.com/
  2. http://c.runoob.com/front-end/854
  3. https://tool.oschina.net/regex

1. 匹配以字母a開頭的單詞

\ba\w*\b正則表達式

2. 匹配恰好6個字符的單詞

\b\w{6}\bexpress

3. 匹配1個或更多連續的數字

\d+編輯器

4. 5位到12位QQ號

\d{5,12}函數

^\d{5,12}$

5. 匹配電話號碼

0\d{2}-\d{8}

6. 只匹配3位數字

^\d{3}$

7. 查找單詞‘GET’

\bGET\b

^GET$

8. 查找‘Hello World’

\bHello\b.*\bWorld\b

Python正則表達式

Python有一個內置正則表達式模塊 re ,可使用它來進行字符串操做:

import re

re模塊提供瞭如下4種方法:

  • findall:返回全部匹配項
  • search:若是匹配到目標字符,返回一個匹配對象,用於判斷是否存在目標字符串
  • split:分割
  • sub:替換

匹配數字、字母

text = '1&\nbsp;hour(s) 2&\nbsp;min 25&\nbsp;s'
re.findall(r'\d+',text) # 匹配時間(數字)
re.findall(r'\d+|(?<=;)\w+',text) # 匹配時間和單位

output:

['1', '2', '25']
['1', 'hour', '2', 'min', '25', 's']
re.findall(r'\d{2}+',text) # 匹配2位數字

查找替換兩個字符串之間內容

替換字符target_text

xpath_path = '//*[contains(text(),"target_text")]/../td[5]/span' # xpath路徑
repl = "須要替換成的字符串"
re.sub(r"(?<=\").*?(?=\")", repl, xpath_path) # 替換要查找的文本

output:

'//*[contains(text(),"須要替換成的字符串")]/../td[5]/span'

添加千位分割符

number = '12345678' 
re.sub(r"\B(?=(?:\d{3})+(?!\d))", ",",number) # 替換要查找的文本
re.sub(r"\B(?:(?:\d{3})+(?!\d))", ",",number)

output:

'12,345,678'
'12,'

(?:\d{3})+(?!\d):

  • 查找3n(數字) + 非數字 組合

(?:exp) :

  • 匹配exp,不捕獲匹配的文本(非獲取匹配),也不給此分組分配組號,當執行了第一次匹配時,匹配到了行尾,直接將345678替換成了「,」。

參考文檔

  1. 正則表達式30分鐘入門教程:https://deerchao.cn/tutorials/regex/regex.htm
  2. github項目learn-regex:https://github.com/ziishaned/learn-regex
  3. https://www.w3schools.com/python/python_regex.asp
--THE END--

文章標題:Python正則表達式
本文做者:hiyo
本文連接:https://www.cnblogs.com/hiyong/p/14175955.html 歡迎關注公衆號:「測試開發小記」及時接收最新技術文章!

相關文章
相關標籤/搜索