摘要:正則表達式簡介正則表達式英語,在代碼中常簡寫為或,又稱正規表示式正規表示法正規表達式規則表達式常規表示法,是計算機科學的一個概念。正則表達式使用單個字符串來描述匹配一系列匹配某個句法規則的字符串。
正則表達式 簡介
正則表達式(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),又稱正規表示式、正規表示法、正規表達式、規則表達式、常規表示法,是計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列匹配某個句法規則的字符串。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些匹配某個模式的文本。
正則表達式規則,單字符匹配字符 | 功能 | 正則表達式示例 | 符合匹配示例 |
---|---|---|---|
. | 匹配任意一個字符(除了n) | b.b | bab,b2b |
[ ] | 匹配來自[]中字符集的任意一個字符 | i [abCde]m | i am |
d | 匹配任何十進制數字,與[0-9]一致 | wdcschool | w3cschool |
D | 匹配非數字,即不是數字 | mouDh | mouth |
s | 匹配任何空格字符,與[ vf]相同 | islike | i like |
S | 匹配任何非空白字符,與s相反 | nSe | noe,n3e |
w | 匹配任何字母數字字符,與[A-Za-z0-9_]相同 | [A-Za-z]w+ | |
W | 匹配非單詞字符 | [0-9]W[A-Z] | 3 A |
字符 | 功能 | 正則表達式示例 | 符合匹配的示例 | |
---|---|---|---|---|
* | 匹配0次或者多次前面出現的正則表達式,即可有可無 | a* | aaa | |
+ | 匹配前一個字符出現1次或者無限次,即至少有一次 | a+ | aaa | |
? | 匹配前一個字符出現1次或者0次,要么有一次,要么沒有 | a? | a或者b | |
{m} | 匹配前一個字符出現m次 | [0-9]{5} | 12345 | |
{m.} | 匹配前一個字符至少出現m次 | a{5.} | aaaaa | |
{m,n} | 匹配前一個字符出現從m到n次 | a{2,6} | aaa |
字符 | 功能 | 正則表達式示例 |
---|---|---|
^ | 匹配字符串起始部分 | ^Dear |
$ | 匹配字符串終止部分 | fi$ |
b | 匹配任何單詞的邊界 | The |
B | 匹配非單詞邊界 | .*Bver |
字符 | 功能 | |
---|---|---|
匹配左右任意一個表達式 | ||
(ab) | 將括號中字符作為一個分組 | |
um | 引用分組num匹配到的字符串 | |
(?P |
分組起別名 | |
(?P=name) | 引用別名為name分組匹配到的字符串 |
在python中,可以使用內置的re模塊來使用正則表達式
re模塊常見的函數和方法核心函數 | 說明 |
---|---|
compile(pattern,flags=0) | 使用任何可選的標記來編譯正則表達式的模式,然后返回一個正則表達式對象 |
re模塊函數和正則表達式對象方法 | 說明 |
---|---|
match(pattern,string,flags=0) | 嘗試使用帶有可選的標記的正則表達式的模式來匹配字符串。如果匹配成功,就返回匹配對象; 如果失敗,就返回 None |
search(pattern,string,flags=0) | 使用可選標記搜索字符串中第一次出現的正則表達式模式。 如果匹配成功,則返回匹配對象; 如果失敗,則返回 None |
findall(pattern,string[,flags]) | 查找字符串中所有出現的正則表達式,并返回一個列表 |
finditer(pattern,string[,flags]) | 與findall相同,但返回的是一個迭代器而不是一個列表(不常用) |
split(pattern,string,max=0) | 根據正則表達式的模式分隔符,spilt函數將字符串分割為列表,然后返回成功匹配的列表,分割最多操作max次(默認分割所有匹配成功的位置) |
sub(pattern,repl,string,count=0) | 使用repl替換所有正則表達式的模式在字符串中出現的位置,除非定義count,否則就將替換所有出現的位置 |
常用的匹配對象方法 | 說明 |
---|---|
group(num=0) | 默認返回整個匹配對象或者返回編號為num的特定子組 |
groups(default=None) | 返回一個包含所有匹配子組的元組,如果沒有成功匹配,返回一個空元組 |
span() |
常用的模塊屬性,大多數用于對正則表達式函數的修飾 | 說明 |
---|---|
re.I | 使匹配對大小寫不敏感(忽略大小寫) |
re.S | .(點號)匹配除了n之外的所有字符,re.S標記表示.(點號)能夠匹配全部字符 |
re.M | 多行匹配,影響^和$ |
re.U | 根據Unicode字符集解析字符。影響w,W,和B |
re.X | 該標志通過給予你更靈活的格式以便你講正則表達式寫得更易于理解 |
使用 compile() 函數將正則表達式的字符串形式編譯為一個正則表達式對象;
通過正則表達式對象提供的一系列方法(如:match())對文本進行匹配查找,獲得匹配結果,一個Match對象;
最后使用Match對象提供的屬性和方法(例如:group())獲得信息,根據需要進行其他的操作。
re模塊使用示例導入模塊
import re
compile()函數
compile 函數用于編譯正則表達式,生成一個 Pattern 對象,它的一般使用形式如下:
import re # 將正則表達式編譯成pattern對象 pattern = re.compile(r"d+")
編譯成正則表達式對象后,就可以使用上面所說的正則表達式對象方法了。
match()方法
match 方法用于查找字符串的頭部(也可以指定起始位置),它是一次匹配,只要找到了一個匹配的結果就返回,而不是查找所有匹配的結果。它的一般使用形式如下:
match(string[, pos[, endpos]])
其中,string是待匹配的字符串,pos 和 endpos 是可選參數,指定字符串的起始和終點位置,默認值分別是 0 和 len (字符串長度)。因此,當你不指定 pos 和 endpos 時,match 方法默認匹配字符串的頭部。
當匹配成功時,返回一個 Match 對象,如果沒有匹配上,則返回 None。
>>> import re >>> >>> pattern = re.compile(r"d+") # 正則表達式表示匹配至少一個數字 >>> >>> m = pattern.match("one2three4") # match默認從開頭開始匹配,開頭是字母o,所以沒有匹配成功 >>> print(m) # 匹配失敗返回None None >>> >>> m = pattern.match("1two3four") # 開頭字符是數字,匹配成功 >>> print(m) <_sre.SRE_Match object; span=(0, 1), match="1"> >>> >>> m.group() # group()方法獲取匹配成功的字符 "1" >>> m = pattern.match("onetwo3four56",6,12) # 指定match從數字3開始查找,第一個是數字3,匹配成功 >>> print(m) <_sre.SRE_Match object; span=(6, 7), match="3"> >>> m.group() "3"
search()方法
search 方法用于查找字符串的任何位置,從任何位置開始往后查找,它也是一次匹配,只要找到了一個匹配的結果就返回,而不是查找所有匹配的結果,它的一般使用形式如下:
search(string[, pos[, endpos]])
其中,string 是待匹配的字符串,pos 和 endpos 是可選參數,指定字符串的起始和終點位置,默認值分別是 0 和 len (字符串長度)。
當匹配成功時,返回一個 Match 對象,如果沒有匹配上,則返回 None。
In [1]: import re In [2]: pattern = re.compile(r"[A-Za-z]+") # 表示匹配至少一個字母 In [3]: ret = pattern.search("123four5") # 這里如果使用match則不匹配,因為以數字開頭 In [4]: print(ret) <_sre.SRE_Match object; span=(3, 7), match="four"> In [5]: ret.group() Out[5]: "four" In [9]: ret = pattern.search("123four5six789",7,12) In [10]: print(ret) <_sre.SRE_Match object; span=(8, 11), match="six"> In [11]: ret.group() Out[11]: "six" In [12]: ret = pattern.search("123four5six789",1,2) In [13]: print(ret) # 不匹配,返回None None
findall()方法
match方法和search方法都是匹配到正則表達式的第一個內容,如果想要獲取正則表達式匹配的所有內容,就可以使用findall方法了。這個方法會搜索整個字符串,然后返回匹配正則表達式的所有內容。
findall 方法的使用形式如下:
findall(string[, pos[, endpos]])
其中,string 是待匹配的字符串,pos 和 endpos 是可選參數,指定字符串的起始和終點位置,默認值分別是 0 和 len (字符串長度)。
findall 以列表形式返回全部能匹配的子串,如果沒有匹配,則返回一個空列表。
示例:
import re pattern = re.compile(r"d+") ret1 = pattern.findall("hello 123 world 456")# 匹配123,456 ret2 = pattern.findall("one1two2three3") # 匹配1,2,3 ret3 = pattern.findall("hello world") # 沒有數字不匹配,返回空列表 print(ret1) print(ret2) print(ret3)
運行結果:
["123", "456"] ["1", "2", "3"] []
spilt()方法
split 方法按照能夠匹配的子串將字符串分割后返回列表,它的使用形式如下:
split(string[, maxsplit])
其中,maxsplit 用于指定最大分割次數,不指定將全部分割。
示例:
>>> import re >>> >>> pattern = re.compile(r"[s;,]+") >>> ret = pattern.split("hello world;;ha,ha") >>> print(ret) ["hello", "world", "ha", "ha"]
sub()方法
sub 方法用于替換,在python爬蟲中常用語修改文本。比如把一串文本中所有數字去掉,把數字去掉可以使用字符串方法中的replace方法,但是太麻煩了,使用sub()方法就可以很方便去掉。sub()方法的使用形式如下:
sub(repl, string[, count])
其中,repl 可以是字符串也可以是一個函數:
如果 repl 是字符串,則會使用 repl 去替換字符串每一個匹配的子串,并返回替換后的字符串,另外,repl 還可以使用 id 的形式來引用分組,但不能使用編號 0;
如果 repl 是函數,這個方法應當只接受一個參數(Match 對象),并返回一個字符串用于替換(返回的字符串中不能再引用分組)。
count 用于指定最多替換次數,不指定時全部替換。
示例:
import re content = "42hjad24ta d25a14aad" content = re.sub("d+","",content) print(content)
運行結果:
hjadta daaad正則表達式規則常見使用 貪婪匹配和非貪婪匹配
貪婪模式:在整個表達式匹配成功的前提下,盡可能多的匹配 ( * );
非貪婪模式:在整個表達式匹配成功的前提下,盡可能少的匹配 ( ? );
Python中默認是貪婪模式
示例
源字符串:abccc
貪婪模式匹配:abc*
非貪婪模式匹配:abc*?
abc*,匹配盡可能多個c
abc*?,匹配盡可能少個c,最少為0即沒有,所以打印ab
>>> import re >>> >>> ret = re.match("abc*","abccc") >>> print(ret) <_sre.SRE_Match object; span=(0, 5), match="abccc"> >>> >>> ret.group() "abccc" >>> >>> ret = re.match("abc*?","abccc") >>> ret.group() "ab"分組
圓括號()匹配封閉的正則表達式,然后另存為子組。
>>> m = re.match("(www)@(ffffd).(www)","xxx@163.com") >>> m.group() "xxx@163.com" >>> m.group(1) "xxx" >>> m.group(2) "163" >>> m.group(3) "com" >>> m.groups() ("xxx", "163", "com")
group()通常用于以普通方式顯示所有的匹配部分,但也可以用于獲取各個匹配的子組。而groups()方法可以獲取一個包含所有匹配子字符串的元組。
轉義匹配當匹配目標中有正則表達式的特殊字符,就需要使用轉義字符""將特殊字符的作用屏蔽掉。
>>> content = "(hello,world)" >>> m = re.match("(.*)",content) >>> print(m) <_sre.SRE_Match object; span=(0, 13), match="(hello,world)"> >>> m.group() "(hello,world)"通用匹配
.(點號)表示匹配任意一個字符,*(星號)表示匹配前面的字符無限次,組合起來.*就是匹配任意字符。
>>> content = "hello 123456789 world hahaha" >>> m = re.match("^hello.*ha$",content) >>> print(m) <_sre.SRE_Match object; span=(0, 28), match="hello 123456789 world hahaha"> >>> m.group() "hello 123456789 world hahaha"匹配多個字符串
豎線"|"表示匹配豎線左邊的表達式或者右邊的表達式,如re1|re2,滿足其中一個表達式就匹配成功
>>> m = re.match("abc|adc|aec","adc") >>> m.group() "adc" >>> m = re.match("abc|adc|aec","aoc") >>> print(m) None >>> m = re.findall("abc|adc|aec","abc aec aoc") >>> print(m) ["abc", "aec"][]字符集使用
方括號[]表示匹配來自字符集中任意一個字符。
>>> m = re.match("[abc][123][A-Z]","b2A") >>> m.group() "b2A" >>> m = re.match("[abc][123][A-Z]","a3A") >>> m.group() "a3A" >>> m = re.match("[abc][123][A-Z]","d2B") # 不匹配 >>> print(m) None >>>
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43229.html
摘要:正則表達式關閉或可選標志。如果所含正則表達式,以表示,在當前位置成功匹配時成功,否則失敗。否則指的是八進制字符碼的表達式。 正則表達式是個很牛逼的東西,不管是在javascript,還是在Python web開發(http://www.maiziedu.com/course/python-px...)中,我們都會遇到正則表達式,雖然javascript和Python的正則表達式區別不大...
摘要:多行模式,改變元字符和的行為。模塊級方法編譯正則表達式,返回一個對象。掃描參數,查找正則表達式產生匹配的第一個結果,返回一個對象。清空正則表達式緩存。和參數意義同與模塊級的相同與模塊級的相同屬性返回一個正整數,表示正則匹配模式。 匹配模式 re.ASCII同re.A,對應的內聯標識為(?a),用于向后兼容。使元字符w, W, , B, d, D, s和S僅匹配ASCII字符。該模式只...
摘要:正則表達式語法字符與字符類特殊字符以上特殊字符要想使用字面值,必須使用進行轉義字符類包含在中的一個或者多個字符被稱為字符類,字符類在匹配時如果沒有指定量詞則只會匹配其中的一個。 1. 正則表達式語法 1.1 字符與字符類 1 特殊字符:.^$?+*{}| 以上特殊字符要想使用字面值,必須使用進行轉義 2 字符類 1. 包含在[]中的一個或者多個字符被稱為字符類,字符類在匹配時如果沒有指...
摘要:正則表達式匹配的字符串限定范圍和否定除了單字符外,字符集還支持匹配指定的字符范圍。問號要求正則表達式引擎在當前正則表達式中盡可能少地匹配字符。正則表達式匹配的字符串表示簡單浮點數的字符串擴展表示法正則表達式的擴展表示法,以問號開始。 簡介 正則表達式 是包含文本和特殊字符的字符串, 為高級的文本模式匹配, 抽取, 與文本形式的搜索和替換功能提供了基礎 Python通過標準庫re模...
摘要:反斜杠的困擾與大多數編程語言相同,正則表達式里使用作為轉義字符,這就可能造成反斜杠困擾。文本中正則表達式結束搜索的索引。以元組形式返回全部分組截獲的字符串。用于指定最大分割次數,不指定將全部分割。 1. 正則表達式基礎 1.1. 簡單介紹 正則表達式并不是Python的一部分。正則表達式是用于處理字符串的強大工具,擁有自己獨特的語法以及一個獨立的處理引擎,效率上可能不如str自帶的方法...
閱讀 3705·2021-11-22 13:52
閱讀 3602·2019-12-27 12:20
閱讀 2385·2019-08-30 15:55
閱讀 2144·2019-08-30 15:44
閱讀 2262·2019-08-30 13:16
閱讀 574·2019-08-28 18:19
閱讀 1881·2019-08-26 11:58
閱讀 3436·2019-08-26 11:47