正則的基本語(yǔ)法
語(yǔ)法 |
說(shuō)明 |
表達(dá)式實(shí)例 |
匹配的字符串 |
字符 |
- |
- |
- |
一般的字符 |
abc等任意你寫(xiě)的字符串 |
"abc" |
"abc" |
. |
匹配任意除了換行符"\n"之外的字符 |
"." |
"a" |
\ |
轉(zhuǎn)義字符 |
"a\.c" |
"a.c" |
[...] |
多個(gè)字符選一個(gè) |
"a[bcd]e" |
"abe" "ace" "ade" |
字符集 |
|
|
\d |
數(shù)字0-9,等價(jià)于正則[0-9] |
"a\\dc" |
"a1c" |
\D |
非數(shù)字其他字符 |
\D |
"a" "b" "c" |
\s |
空白字符[空格\t\r\n\f\v] |
"a\sc" |
"a c" "a\tc" "a\r\nc" |
\S |
非空白字符[^\s] |
"a\Sc" |
"abc" |
\w |
字母數(shù)字下劃線[A-Za-z0-9_],包括中文,不匹配標(biāo)點(diǎn)符號(hào) |
"a\wc" |
"abc" "a_c" "a1c" |
\W |
非字母數(shù)字下劃線[^A-Za-z0-9_],包括空白字符,不包括中文,匹配標(biāo)點(diǎn)符號(hào) |
"a\Wc" |
"a c" "a你c" |
數(shù)量詞 |
|
|
* |
匹配它前面一個(gè)字符0或無(wú)限次 |
"abc* |
"ab" "abc" "abccccc" |
+ |
匹配它前面一個(gè)字符1或無(wú)限次 |
"abc*" |
"abc" "abcccc" |
? |
匹配它前面一個(gè)字符0或1次 |
"abc?" |
"ab" "abc" |
{m} |
匹配它前面一個(gè)字符m次 |
"ab{2}c" |
"abbc" |
{m, n} |
匹配它前面一個(gè)字符m-n次 |
"ab{1,2}c" |
"abc" "abbc" |
*? +? ?? {m, n}? |
使數(shù)量變成非貪婪模式 |
"ab{1,2}c" |
"abc" "abbc" |
邊界匹配 |
|
|
^ |
匹配行的開(kāi)頭 |
^abc |
abc |
$ |
匹配行的末尾 |
abc$ |
abc |
\A |
匹配字符串開(kāi)頭 |
\Aabc |
abc |
\Z |
匹配字符串末尾 |
abc\Z |
abc |
\b |
匹配\w\W之間,后面碰見(jiàn)空白字符或者符號(hào)就匹配,只匹配字母,不匹配數(shù)字和中文 |
a\b!bc |
a!bc |
\B |
非\b[^\b],后面不需要跟上分隔符 |
a\Bbc |
abc |
邏輯分組 |
|
|
|
左右任意一個(gè) |
"abc | bcd" |
"abc" "bcd" |
(...) |
分組,下標(biāo)從1開(kāi)始 |
"(abc){2}" "(abc)\1" |
"abcabc" |
<num> |
引用編號(hào)為<num>的分組匹配到的字符串 |
"(name)(id)\1\2" |
"nameidnameid" |
(?P<name>...) |
分組,除了原有的編號(hào)之外再指定一個(gè)別名 |
"(?P<id>abc){2}" |
"abcabc" |
(?P=name) |
引用別名為<name>的分組匹配到的字符串 |
"(?P<id>\d)abc(?P=id)" |
1abc5 |
特殊構(gòu)造 |
|
|
(?:...) |
(...)的不分組版本,后面可以接數(shù)量詞 |
(?:abc){2} |
abcabc |
(?iLmsux) |
?后面的每一個(gè)字符都是一種匹配模式 |
(?i)abc |
AbC |
(?#...) |
正則表達(dá)式的注釋 |
abc(?#comment)123 |
abc123 |
(?=...) |
之后的字符串內(nèi)容需要匹配表達(dá)式才能成功匹配,括號(hào)內(nèi)的是規(guī)則,不參與匹配內(nèi)容 |
a(?=\d) |
后面是數(shù)字的 a字符串(a1) |
(?!...) |
之后的字符串內(nèi)容需要不匹配表達(dá)式才能成功匹配,括號(hào)內(nèi)的是規(guī)則,不參與匹配內(nèi)容 |
a(?!\d) |
后面不是數(shù)字的 a字符串(ab) |
(?<=...) |
之前的字符串內(nèi)容需要匹配表達(dá)式才能成功匹配,括號(hào)內(nèi)的是規(guī)則,不參與匹配內(nèi)容 |
a(?<=\d) |
前面是數(shù)字的 a字符串(1a) |
(?<!...) |
之前的字符串內(nèi)容不匹配表達(dá)式才能成功匹配,括號(hào)內(nèi)的是規(guī)則,不參與匹配內(nèi)容 |
a(?<!\d) |
前面不是數(shù)字的 a字符串(ba) |
(?(id/name)yes-pattern|nopattern) |
-暫時(shí)不寫(xiě),后面理解了再寫(xiě)上去- |
(\d)abc(?(1)\d|abc) |
- |
貪婪與非貪婪模式
- Python中的數(shù)量詞默認(rèn)是貪婪模式的,總是默認(rèn)嘗試匹配更多的字符,非貪婪模式則是盡可能少的匹配字符
貪婪模式的例子
pat = re.compile("ab*")
str1 = pat.findall("abbbbbbbbb")
print(str1)
---------------
['abbbbbbbbb']
非貪婪模式的例子
pat = re.compile("ab*?")
str1 = pat.findall("abbbbbbbbb")
print(str1)
---------------
['a']
反斜杠的困擾
- 表示\d可以用r"\d"代替"\\d"
- 表示\可以用r"\\"替代"\\\\"
re模塊-正則的七個(gè)方法
match(pat, orginStr[, flag])
m = re.match(pat, orginStr[, flag])
m.string
match方法解釋
- 從原始字符串第一個(gè)字符開(kāi)始,匹配正則的規(guī)則
- 如果不是從第一個(gè)字符開(kāi)始就匹配不到
- 參數(shù)1:正則表達(dá)式
- 參數(shù)2:原始的字符串
- 參數(shù)3:匹配模式(可選參數(shù))
match方法返回值的屬性
- m.string: 匹配時(shí)使用的文本
- m.re: 匹配時(shí)使用的Pattern對(duì)象
- m.pos: 文本中正則表達(dá)式開(kāi)始搜索的索引
- m.endpos: 文本中正則表達(dá)式結(jié)束搜索的索引
- m.lastindex: 最后一個(gè)被捕獲的分組在文本中的索引
- m.lastgroup: 最后一個(gè)被捕獲的分組的別名
match方法返回值的方法
- re.group(group1...):獲得一個(gè)或多個(gè)分組截獲的字符串;指定多個(gè)參數(shù)時(shí)將以元組形式返回,group1可以是編號(hào),也可以是別名
- re.groups([default]):以元組的形式返回全部分組捕獲的字符串,如果沒(méi)有找到返回default設(shè)置的值,默認(rèn)返回None
- groupdict([default]):返回以有別名的組的別名為鍵飞涂、以該組截獲的子串為值的字典,沒(méi)有別名的組不包含在內(nèi)
- start([group]):返回指定的組截獲的子串在string中的起始索引(子串第一個(gè)字符的索引).group默認(rèn)值為0
- end([group]):返回指定的組截獲的子串在string中的結(jié)束索引(子串最后一個(gè)字符的索引+1).group默認(rèn)值為0
- span([group]):返回(start(group),end(group))
- expand(template):將匹配到的分組代入template中然后返回
search()
compile
pat = re.compile("ab*?") # 得到一個(gè)正則表達(dá)式的對(duì)象
compile(pat[,flag])
- 第一個(gè)參數(shù)是正則表達(dá)式
- 第二個(gè)參數(shù)是匹配模式
compile匹配模式
模式 |
詳解 |
re.I/re.IGNORECASE |
忽略大小寫(xiě) |
re.M/re.MULTILINE |
多行模式,改變'^'和'$'的行為 |
re.S(re.DOTALL) |
點(diǎn)任意匹配模式,改變'.'的行為 |
re.L(re.LOCALE) |
使預(yù)定字符類 \w \W \b \B \s \S 取決于當(dāng)前區(qū)域設(shè)定 |
re.U(re.UNICODE) |
使預(yù)定字符類 \w \W \b \B \s \S \d \D |
re.X(re.VERBOSE) |
詳細(xì)模式,可以是多行,忽略空白字符,可以加入注釋 |
escape(str)
re.escape("\d") --> \\d
escape方法詳解
- 用于將元字符串進(jìn)行轉(zhuǎn)義后再返回
- 感覺(jué)沒(méi)有半點(diǎn)用
findall()
split()
sub()\subn()
purge():清空緩存中的正則表達(dá)式,等待驗(yàn)證,有點(diǎn)坑
re.purge() --> 返回值是None
Pattern對(duì)象
pattern = re.compile("正則表達(dá)式")
Pattern對(duì)象的屬性
- pattern: 編譯時(shí)用的表達(dá)式字符串
- flags: 編譯時(shí)用的匹配模式,數(shù)字形式
- groups: 表達(dá)式中分組的數(shù)量
- groupindex: 以表達(dá)式中有別名的組的別名為鍵咙轩、以該組對(duì)應(yīng)的編號(hào)為值的字典,沒(méi)有別名的組不包含在內(nèi)
Pattern對(duì)象的方法
1. match(string[, pos[, endpos]]) | re.match(pattern, string[, flags])
- 從第一個(gè)字符開(kāi)始匹配
- string是要匹配的字符串
- pos是起始匹配的位置
- endpos:終止匹配的位置
- 返回值是一個(gè)Match對(duì)象
match方法例子
import re
p = re.compile(r'(\w+) (\w+)(?P<sign>.*)', re.DOTALL)
print("p.pattern:", p.pattern)
print("p.flags:", p.flags)
print("p.groups:", p.groups)
print("p.groupindex:", p.groupindex)
### output ###
# p.pattern: (\w+) (\w+)(?P<sign>.*)
# p.flags: 16
# p.groups: 3
# p.groupindex: {'sign': 3}
2. search(string[, pos[, endpos]]) | re.search(pattern, string[, flags])
- 從字符整個(gè)字符串開(kāi)始搜索匹配
- string是要匹配的字符串
- pos是起始匹配的位置
- endpos:終止匹配的位置
- 返回值是一個(gè)Match對(duì)象
search方法例子
# encoding: UTF-8
import re
# 將正則表達(dá)式編譯成Pattern對(duì)象
pattern = re.compile(r'world')
# 使用search()查找匹配的子串殴泰,不存在能匹配的子串時(shí)將返回None
# 這個(gè)例子中使用match()無(wú)法成功匹配
match = pattern.search('hello world!')
if match:
# 使用Match獲得分組信息
print match.group()
### 輸出 ###
# world
3. split(string[, maxsplit]) | re.split(pattern, string[, maxsplit])
- 從字符整個(gè)字符串開(kāi)始搜索匹配
- string:要匹配的字符串
- maxsplit:指定最大分割次數(shù)巧还,不指定將全部分割
- 返回值是一個(gè)分割的列表
split方法例子
import re
p = re.compile(r'\d+')
list1 = p.split('one1two2three3four4')
print(list1)
### output ###
# ['one', 'two', 'three', 'four', '']
4. findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags])
- 從開(kāi)頭到末尾匹配字符串
- string是要匹配的字符串
- pos是起始匹配的位置
- endpos:終止匹配的位置
- 返回一個(gè)找尋到的列表
findall方法例子
import re
p = re.compile(r'\d+')
list1 = p.findall('one1two2three3four4')
print(list1)
### output ###
# ['1', '2', '3', '4']
5. finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags])
- 過(guò)濾出想要的數(shù)據(jù)穗泵,返回值是一個(gè)迭代器
finditer方法例子
import re
p =re.compile(r'\d+')
for m in p.finditer('one1two2three3four4'):
print m.group()
### output ###
# 1 2 3 4
6. sub(repl, string[, count]) | re.sub(pattern, repl, string[, count])
- 利用repl字符串替換原有string字符串
- 第一個(gè)參數(shù)repl:要替換的字符串
- 第二個(gè)參數(shù)string:原始字符串
- 第三個(gè)參數(shù)count:count用于指定最多替換次數(shù),不指定時(shí)全部替換
- 返回值:返回一個(gè)字符串
sub方法例子
import re
p = re.compile(r'(\w+) (\w+)')
s = 'i say, hello world!'
print p.sub(r'\2 \1', s)
def func(m):
return m.group(1).title() + ' ' + m.group(2).title()
print p.sub(func, s)
### output ###
# say i, world hello!
# I Say, Hello World!
7. subn(repl, string[, count]) | re.sub(pattern, repl, string[, count])
- 利用repl字符串替換原有string字符串和上面的方法相比多一個(gè)返回次數(shù)
- 第一個(gè)參數(shù)repl:要替換的字符串
- 第二個(gè)參數(shù)string:原始字符串
- 第三個(gè)參數(shù)count:count用于指定最多替換次數(shù),不指定時(shí)全部替換
- 返回值是一個(gè)元組形式的:(找到的字符串,出現(xiàn)次數(shù))
subn方法例子
import re
p = re.compile(r'(\w+) (\w+)')
s = 'i say, hello world!'
p.subn(r'\2 \1', s)
print()
def func(m):
return m.group(1).title() + ' ' + m.group(2).title()
print p.subn(func, s)
### output ###
# ('say i, world hello!', 2)
# ('I Say, Hello World!', 2)
常見(jiàn)的正則表達(dá)式
QQ表達(dá)式
"[1-9]\\d{4,10}"
QQ號(hào)規(guī)則
- 首先扣扣號(hào)開(kāi)頭不能為0;
- QQ號(hào)必須大于5且小于11(或12,13,QQ號(hào)最長(zhǎng)位)
手機(jī)號(hào)表達(dá)式
# 平常手機(jī)號(hào)
"1[34578]\\d{9}"
# 手機(jī)號(hào)碼后5位相同
"1[34578]\\d{4}(\\d)\\1{4}"
手機(jī)號(hào)碼規(guī)則
- 手機(jī)號(hào)位數(shù)為11位
- 開(kāi)頭為1,第二位為3或4或5或7或8
郵箱表達(dá)式
"[a-zA-Z0-9_-]+\@(?:[a-zA-Z0-9_-]+\.)+[a-z]{2,4}"
郵箱規(guī)則
- @符號(hào)前面的可以為字母,數(shù)字,下劃線,中劃線,或'.'
- @后面的可以是xxx.com盗尸、xxx.cn柑船、xxx.com.cn
用戶名表達(dá)式
"[a-zA-z]\\w{0,9}"
用戶名規(guī)則
- 必須以字母開(kāi)頭,長(zhǎng)度在10位以內(nèi)
密碼表達(dá)式
".{6,16}"
密碼規(guī)則
- 任意字符泼各,6~16位