python3 匹配空格 正则_玩转正则表达式
一、什么是正則表達式
在介紹正則表達式前,我們需要樹立一個概念:所有內容本質上都是一個字符,比如我們書寫的文字就是一連串字符組成的字符串;比如字母,數字,標點符號和其他符號等等。
正則表達式(Regular Expression,常簡寫為regex、regexp或RE),是一組由字母和符號組成的特殊文文本,所有內容本質都是一個字符,在日常的編程中,經常使用正則表達來來檢索、替換、提取文檔中的內容。
比如我們需要搜索Hello World! 中的字符時,只需要一個正則表達式Hello,即可完成匹配。
"Hello" => Hello World!.正則表達式適用于不同編程語言,規則還是重點,無論是C++,Java還是Python的編程使用正則表達式的規則基本一致,只是調用不同方法,因此學會了正則表達式的規則就可以在不同編程語言使用,本文為了讓讀者更加直觀的理解規則,使用Python作為示例。
二、元字符
正則表達式主要由元字符組成。 這些元字符不再表示它們原本的意思,而是有特殊的含義。下面是常用的元字符在正則表達式中的含義:
| ^ | 匹配一行的開始 |
| $ | 匹配一行的結束 |
| . | 匹配任意的字符 |
| s | 匹配空格 |
| S | 匹配任意的非空格字符 |
| d | 匹配數字(范圍為0-9) |
| D | 匹配不是數字的字符 |
| * | 重復一個字符至少0次 |
| + | 重復一個字符至少1次 |
| [abc] | 匹配abc中的一個字符 |
| ^[abc] | 匹配非abc中的一個字符 |
| [a-z0-9] | 字符集可以包含一個范圍 |
| ( | 指示從何處開始提取字符串 |
| ) | 指示字符串提取將在何處結束 |
三、如何使用正則表達式
在Python中使用正則表達式之前,需要先使用import re導入正則表達式庫。在日常使用中,主要用到re.search() 和 re.findall()兩個方法來檢索和提取文本內容,后續的內容將會結合這兩個方法和正則表達式的規則進行分享。
如果您使用其他的編程語言,也可以找到對應的方法。import re3.1 基本匹配
方法re.search()用于查找字符串中和正則表達式相匹配的內容,如果存在相匹配的內容,返回一個Match對象;未找到匹配項,則返回None。
在日常文本提取和爬蟲中,常用于判斷語句中,如果檢索的字符串存在相應的內容,再進行進一步的操作,例如,判斷字符串Hello, World中是否含有Hello,如果存在則輸出原來的字符串。
string = 'Hello, World' if re.search('Hello', string):print(string) else:print('Cannot find!') Hello, World3.2 數字提取
字符包括字母,也包括數字。數字0-9也是字符,可以使用字符d匹配0到9之間的任何數字。+字符d表示它是一個元字符。
string = '123abc' string_2 = '12abc' if re.search('ddd', string): # string中包含123三個數字可以匹配print(string) if re.search('ddd', string_2): # string中僅包含12兩個數字無法匹配print(string_2) 123abc3.3 任意字符
在某些紙牌游戲中,大小王可以代表任何紙牌。在正則表達式中,元字符.功能類似。可以匹配任何單個字符(字母,數字,空格等等)。
.常用于知道具有相同的模式或結構但不確定內容的文本,例如:電話號碼、郵政編碼等等。
string = '0755-123' string_2 = '0755-abc' if re.search('....-...', string):print(string) if re.search('....-...', string_2):print(string_2) 0755-123 0755-abc3.4 特定字符
上一節中元字符.功能非常強大,但有時功能太強大;例如,上述的字符串0737-abc包含字母也被匹配上了,事實上電話號碼中并不含有字母。
正則表達式中方括號[]表示匹配特定字符,例如,[123]僅匹配1,2,3三個數字中的一個,而不匹配其他項。
string = '0755-123' string_2 = '0737-abc' if re.search('....-[123][123][123]', string):print(string) if re.search('....-[123][123][123]', string_2):print(string_2) 0755-1233.5 字符范圍
除了匹配或排除特定字符之外,如果我們要匹配連續范圍內的字符的字符時,可以通過使用-破折號來指示字符范圍,例如,[0-6]將只匹配從0到6的任何一位數字,而沒有其他字符。同樣,[^n-p]將僅匹配除n至p之外任何單個字符。
一個方括號內也可以使用多個字符范圍,例如,[A-Za-z0-9_],通常用于匹配英文文本中的字符。
string = 'abc-123' string_2 = 'xyz-124' if re.search('...-[1-3][1-3][1-3]', string): print(string) if re.search('...-[1-3][1-3][1-3]', string_2):print(string_2) abc-1233.6 重復
ddd會精確匹配三位數字,但是如果匹配20個數字,這些的寫法就會變得不方便并且影響程序的美觀,一種更方便的方法是使用{}大括號指定每個字符要重復多少次。例如,d{20}就可以完成20個數字的匹配.
此外,正則表達式可以指定此重復次數的范圍,例如,a{1,3}表示匹配不超過3次,但不少于一次。
大括號{}可以與任何字符或者元字符一起使用,例如,[wxy]{5}表示重復五個字符,每個字符可以是w,x或y。
string = 'aaaaaaaa-111' string_2 = 'xyzzxzy-124' if re.search('[a]{8}-d{3}', string):print(string) if re.search('[xyz]{6}-', string_2):print(string_2) aaaaaaaa-111 xyzzxzy-1243.7 至少
元字符*或者+以匹配任意數量的字符,例如:使用d*可以匹配任意個數的數字,d+匹配至少包含一位數字。
在正則表達式中,我們可以將任何字符或特殊元字符一起使用,組成更加復雜的內容匹配,例如,[abc]+匹配a,b或c任何字符中的一個或多個。
string = 'aaaaaaaa-111' string_2 = 'xyzzxzy-124' if re.search('[a]+-d{3}', string):print(string) if re.search('[xyz]*-', string_2):print(string_2) aaaaaaaa-111 xyzzxzy-1243.8 可選字符
?元字符表示可選,用于匹配文本中不確定的字符,例如,ab?c將匹配字符串“abc”或“ac”,b被認為是不確定的內容.
string = 'abc-123' string_2 = 'ac-124' if re.search('ab?c', string): print(string) if re.search('ab?c', string_2):print(string_2) abc-123 ac-1243.9 空白
在實際處理文本時,經常遇到空格。最常見的空格形式是空格(?),制表符(t),換行符(n)和回車符(r)等,s將任何特定空格匹配,在處理原始輸入文本時非常有用。
string = ' abc-123' string_2 = 'ac124' if re.search('s', string):print(string) if re.search('s', string_2):print(string_2) abc-1233.10 開始和結束
^和$元字符定義一個行的開始和結束;例如,我們可以使用^abc來僅匹配以“abc”開頭的行,可以使用123$來匹配以“123”結束的行。
string = 'abc-123' string_2 = 'ac124' if re.search('^abc', string): print(string) if re.search('^abc', string_2):print(string_2) abc-123 string = 'abc-123' string_2 = 'ac124' if re.search('123$', string):print(string) if re.search('^123$', string_2):print(string_2) abc-1233.11 邏輯運算符
在正則表達式中,可以使用|表示邏輯“或”運算,匹配可能的字符。例如,(abc|xyz)可以匹配abc或xyz,
string = 'abc-xyz' string_2 = 'xyz-abc' if re.search('^abc|xyz', string): print(string) if re.search('^abc|xyz', string_2):print(string_2) abc-xyz xyz-abc3.12 嵌套
面對復雜數據時,我們也許需要提取多層信息,()可以用于提取嵌套的信息,例如,1280x720中,我們學要提取1280和720這兩個數字,而不要提取x這個符號。
Python中re.findall()方法,常用于文本的提取,第一個參數是對應的正則表達式,第二個參數是需要提取的文本內容。
string = '1280x720-abc-abc' string_2 = 'ac124-abc-' print(re.findall('(d{4})x(d{3})',string)) print(re.findall('(abc)-',string_2)) [('1280', '720')] ['abc']3.13 貪婪匹配
貪婪匹配是指正則表達式會盡可能長的匹配字符串,例如,用^F.+:匹配字符串'From: Michael, Reason: the'時,會匹配到'From: Michael, Reason:',而非'From:'。
正則表達式默認采用貪婪匹配,我們可以使用?將貪婪匹配轉化為非貪婪匹配匹配;將上述^F.+:修改為^F.+?:就可以只匹配到'From:'。
string = 'From: Michael, Reason: the' print(re.findall('^F.+:',string)) print(re.findall('^F.+?:',string)) ['From: Michael, Reason:'] ['From:']常用匹配
下面是經常使用的匹配規則,無需逐一掌握,在需要使用正則表達式時,可以對照此表,結合上述掌握的規則,基本可以實現日常需求。
數字匹配
1. 數字:^[0-9]*$ 2. n位的數字:^d{n}$ 3. 至少n位的數字:^d{n,}$ 4. m-n位的數字:^d{m,n}$ 5. 正數、負數、和小數:^(-|+)?d+(.d+)?$ 6. 小數:^(-?d+)(.d+)?$ 7. 正小數:^[1-9]d*.d*|0.d*[1-9]d*$ 8. 負小數:^-([1-9]d*.d*|0.d*[1-9]d*)$ 9. 非負整數:^d+$ 或 ^[1-9]d*|0$ 10. 非正整數:^-[1-9]d*|0$ 11. 非負小數:^d+(.d+)?$ 12. 非正小數:^((-d+(.d+)?)|(0+(.0+)?))$字符串
1. 26個英文字母組成的字符串:^[A-Za-z]+$ 2. 26個大寫英文字母組成的字符串:^[A-Z]+$ 3. 26個小寫英文字母組成的字符串:^[a-z]+$ 4. 數字和26個英文字母組成的字符串:^[A-Za-z0-9]+$ 5. 數字、26個英文字母或者下劃線組成的字符串:^w+$ 或 ^w{3,20}$特殊需求
1. Email地址:^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$ 2. 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.? 3. URL:[a-zA-z]+://[^s] 4. 手機號碼:^(13[0-9]|14[0-9]|15[0-9]|16[0-9]|17[0-9]|18[0-9]|19[0-9])d{8}$ 5. 日期格式:^d{4}-d{1,2}-d{1,2} 6. 12個月(01~09和1~12):^(0?[1-9]|1[0-2])$ 7. 一個月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$ 8. IP地址:d+.d+.d+.d+總結
以上是生活随笔為你收集整理的python3 匹配空格 正则_玩转正则表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python鼠标拖拽功能_seleniu
- 下一篇: 链表python笔试题目_python经