您好,登錄后才能下訂單哦!
歡×××陳師傅”
正則表達(dá)式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規(guī)則字符串”,這個“規(guī)則字符串”用來表達(dá)對字符串的一種過濾邏輯。
特殊字符 | 解釋 |
---|---|
. | 匹配除換行符之外的任何字符 |
^ | 匹配字符串的開頭 |
$ | 匹配字符串的結(jié)尾 |
* | 匹配前面的字符0次或更多次,盡可能多的重復(fù),ab*將匹配'a','ab'或者a后面加任意數(shù)量的b |
+ | 匹配前面的字符一次或更多次,ab+將匹配'ab'后加任意數(shù)量的b |
? | 匹配前面的字符0次或一次,ab將匹配'a'或'ab' |
*?,+?,?? | *,+,?都屬于貪婪匹配,就是盡可能多的匹配,而有時我們希望以最少的模式匹配,可以在限定符之后加?表示以最少的方式匹配 |
{m} | 匹配前一個字符至少m次 |
{m,n} | 匹配前一個字符最少m次,最多n次 |
{m,n}? | 以非貪婪模式匹配前一個字符,最少m次,最多n次,并以盡可能少的方式匹配 |
\ | 轉(zhuǎn)義字符,將\后面的字符進行轉(zhuǎn)義 |
[] | 表示一組字符,字符可以單個列出,也可以給定范圍,如[abc]表示a或b或c,[a-z]表示26個小寫字母中的任意一個,[^a-z]匹配非小寫字母,[0-5][0-9]表示匹配00-59,特殊字符在[]也失去特殊意義,[(+ )]將匹配任何文字字符的'(',')','+','' |
丨 | A丨B 匹配A或者B |
() | 匹配括號內(nèi)的正則,每個括號都是一個組,從左往右的括號,編號依次加一 |
\A | 匹配字符串的開頭 |
\b | 只用以匹配單詞的詞首和詞尾(退格符) |
\B | 只在當(dāng)前位置不在單詞邊界時匹配。 |
\d | 匹配任何Unicode的十進制數(shù)字,與[0-9]相同 |
D | 匹配任何非十進制的字符,與[^0-9]相同 |
\s | 匹配Unicode的空白字符,匹配ascii字符集中包含空格的字符,相當(dāng)于[\t\n\r\f\v] |
\S | 匹配不是空白字符的字符,相當(dāng)于[^\t\r\n\f\v] |
\w | 匹配字母數(shù)字下劃線,相當(dāng)于[a-zA-Z0-9_] |
\W | 匹配非字母數(shù)字下劃線,相當(dāng)于[^a-zA-Z0-9] |
\Z | 僅匹配字符串結(jié)尾 |
(?P<name>) |
給分組加一個別名,(?P<a>) 給分組取別名為a,每個組名只能在正則表達(dá)式中定義一次 |
(?P=name) | 引用前面別名為name的分組匹配到的任何文本 |
(?<=) | 前向界定,表示你要匹配的字符串前面是某個字符串的時候才匹配,('(?<=abc)def','abcdef')當(dāng)def前面是abc的時候才匹配 |
(?=) | 后向界定,表示你要匹配的字符串后面是某個字符串的時候才匹配,('abc(?=def)','abcdef') |
(?<!) | 非前向界定,表示你要匹配的字符串前面不是某個字符串的時候才匹配,('(?<=abc)def','abcdef')當(dāng)def前面不是abc的時候才匹配 |
(?!) | 非后向界定,表示你要匹配的字符串后面不是某個字符串的時候才匹配,('abc(?=def)','abcdef') |
(?(id/name)yes-pattern | no-pattern) |
re.compile(pattern,flags=0)
編譯一個正則表達(dá)式模式為正則表達(dá)式對象,其可用于使用他的匹配match(),search()以及其他方法
>>> comp=re.compile(r'\d+')
>>> ret=comp.match('123456')
>>> ret.group()
'123456'
相當(dāng)于
ret=re.match(r'\d+','123456')
re.search(pattern,string,flags = 0)
查找正則表達(dá)式匹配到的第一個位置,并返回相應(yīng)的匹配對象
re.match(pattern,string,flags = 0)
從字符串的開頭匹配,并返回相應(yīng)的匹配對象
re.fullmatch(pattern,string,flags = 0)
將會對整個字符串進行匹配,并返回相應(yīng)的匹配對象
>>> re.split(r'\W+','Words words wordS')
['Words', 'words', 'wordS']
>>> re.split(r'\W+','Words words wordS',1)
['Words', 'words wordS']
>>> re.split(r'\d+','1q2W3e4R',flags=re.IGNORECASE)
['', 'q', 'W', 'e', 'R']
>>> re.split(r'(\W+)', 'words, words...')
['words', ', ', 'words', '...', '']
>>> re.split(r'\W+', 'words, words...')
['words', 'words', '']
>>> re.findall(r'\d+','123,456')
['123', '456']
>>> re.findall(r'(\d+)(\w+)','123qw,werrc')
[('123', 'qw')]
>>> re.findall(r'(\d+)|(\w+)','123qw,werrc')
[('123', ''), ('', 'qw'), ('', 'werrc')]
>>> for i in re.finditer(r'\d+','123456'):
print(i.group())
123456
>>> re.sub(r'(\d+) (\w+)',r'\2 \1','12345 asdfd')
'asdfd 12345'
當(dāng)repl是一個函數(shù)時,那么這個函數(shù)會只接受一個匹配對象參數(shù)。例如:
>>> def mat(m):
if m.group(2)=='1234':
return m.group(1)
else:
return '1234'
>>> re.sub(r'(\d+) (\d+)',mat,'123 1234qer')
'123qer'
>>> re.sub(r'(\d+) (\d+)',mat,'123 123qer')
'1234qer'
>>> def mat(m):
if m.group(2)=='1234':
return m.group(1)
else:
return '1234'
>>> re.subn(r'(\d+) (\d+)',mat,'as123 1234qer')
('as123qer', 1)
使用re.compile可以編譯一個正則表達(dá)式對象
>>> pattern=re.compile(r'\d+')
>>> pattern.search('123456',2,5).group()
'345'
a = re.compile(r"""\d + # the integral part
\. # the decimal point
\d * # some fractional digits""", re.X)
b = re.compile(r"\d+\.\d*")
>>> s=re.match(r'(\w+) (\w+)','hello world')
>>> s.group(0)
'hello world'
>>> s.group(1)
'hello'
>>> s.group(2)
'world'
>>> s.group(1,0)
('hello', 'hello world')
如果分組太多,我們可以對分組進行命名
>>> m=re.match(r"(?P<first>\w+) (?P<second>\w+)",'hello world')
>>> m.group('first')
'hello'
>>> m.group('second')
'world'
如果一個組匹配多次,那么最終將返回的最后一次匹配到的字符串
>>> m=re.match(r'(\d)+','123456')
>>> m.group()
'123456'
>>> m.group(1)
'6'
>>> m=re.match(r'(\d)+','123456')
>>> m[0]
'123456'
>>> m[1]
'6'
>>> m=re.match(r'(\d+),(\w+)?','1234,')
>>> m.groups()
('1234', None)
>>> m.groups('0')
('1234', '0')
match.groupdict(default=None)
以字典的形式返回匹配到的值,字典的鍵為分組名,值為匹配到的字符串,沒有匹配到的分組將設(shè)置為None
>>> m=re.match(r'(?P<first>\d+) (?P<second>\d+)','123 456')
>>> m.groupdict()
{'first': '123', 'second': '456'}
>>> m=re.match(r'(\d+) (\d+)','123 456')
>>> m.groupdict()
{}
>>> m=re.match(r'(\w+) (\w+) (\w+) (\w+)','my name is wanger')
>>> m.start(2)
3
>>> m.end(2)
7
>>> m.end()
17
>>> m.start()
0
>>> m=re.match(r'(\w+) (\w+) (\w+) (\w+)','my name is wanger')
>>> m.span(2)
(3, 7)
>>> m.span()
(0, 17)
>>> m=re.match(r'(\w+) (\w+) ','my name is wanger')
>>> m.pos
0
>>> m.endpos
17
>>> m=re.match(r'(\w+) (\w+) ','my name is wanger')
>>> m.lastindex
2
>>> m=re.match(r'(\w+) (\w+) (\w+)','my name is wanger')
>>> m.lastindex
3
>>> m=re.match(r'(\w+) (?P<last>\w+) ','my name is wanger')
>>> m.lastgroup
'last'
>>> re.search(r'(?<=123)\w+','123asd,wer').group(0) 'asd'
2.匹配前面是數(shù)字后面是下劃線的字符
>>> re.search(r'(?<=123)\w+(?=_)','123asd_123wer').group(0)
'asd'
3.匹配手機號碼
>>> re.match(r'1[3,5,7,8]\d{9}|','13573528479').group()
'13573528479'
4.匹配電話號碼
>>> re.match(r'\d{3}-\d{8}|\d{4}-\d{7}','0531-82866666').group()
'0531-8286666'
5.匹配IP地址
>>> re.match(r'\d+\.\d+\.\d+\.\d+','192.168.10.25').group()
'192.168.10.25'
6.匹配網(wǎng)易郵箱
>>> re.findall(r'\w+@163\.com|\w+@126\.com','wanger@163.com wanger@126.com')
['wanger@163.com', 'wanger@126.com']
7.匹配HTML文本
>>> re.match(r'<(\w*)><(\w*)>.*</\2></\1>','<body><h3>wahaha5354</h3></body>').group()
'<body><h3>wahaha5354</h3></body>'
歡迎各位關(guān)注本人微信公眾號“沒有故事的陳師傅”
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。