Python--正则表达式
正则表达式是一种小型的,高度专业化的编程语言。在python中,通过re模块实现。用于匹配字符串。
就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。
字符匹配(普通字符,元字符):
1 普通字符:大多数字符和字母都会和自身匹配
>>> re.findall('alvin','yuanaleSxalexwupeiqi')
['alvin']
2 元字符:. ^ $ * + ? { } [ ] | ( ) \
import re # . 通配符 #ret = re.findall("w..l","hello world") #点只能代指一个字符 通配符 不能代表换行\n #print(ret) #['worl'] # ^ 只对字符串开始匹配 #ret = re.findall("^h..l","hello world") #print(ret) #['hell'] # $ 只对字符串结尾匹配 #ret = re.findall("o..d$","hello ld world") #print(ret) #['orld'] # * 重复匹配,重复前面字符,[0,+00) #ret = re.findall("sd*","shellosdlddsddworllosdlddsd") #print(ret) #['s', 'sd', 'sdd', 'sd', 'sd'] # + 重复匹配,重复前面字符,[1,+00) #ret = re.findall("sd+","shellosdlddsddworllosdlddsd") #print(ret) #['sd', 'sdd', 'sd', 'sd'] # ? 重复前面字符0到1次,[0,1] a+b 表示0到1个a,1个b #ret = re.findall("a?b","shabellosdaablddsdbdworllosdlddsd") #print(ret) #['ab', 'ab', 'b'] # {} 重复前面字符n次, #ret = re.findall("a{3}b","shabellosdaaablddsdbdworllosdlddsd") #print(ret) #['aaab'] # {} 重复前面字符n次, #ret = re.findall("a{3}b","shabellosdaaablddsdbdworllosdlddsd") #print(ret) #['aaab'] # {a,b} 重复前面字符[a,b]次,贪婪匹配,返回最多的重复。 #ret = re.findall("a{1,3}b","aaaaab") #print(ret) #['aaab'] # 对于重复的 * 等价于{0,+00} + 等价于 {1,+00} ? 等价于 {0,1} # [] 字符集 表示或关系 取消元字符功能,三个例外(\ ^ -) #ret = re.findall("a[z,c,k]b","azbacbabakb") #print(ret) #['azb', 'acb', 'akb'] #ret = re.findall("[a-z]","azbacbabakb") #print(ret) #['a', 'z', 'b', 'a', 'c', 'b', 'a', 'b', 'a', 'k', 'b'] #ret = re.findall("[a,*]","a*bcdfs") #print(ret) #['a', '*'] 取消元字符功能 #ret = re.findall("[^1,2]","1246312") # ^ 放到中括号,表示取反 #print(ret) #['a', '*'] 取消元字符功能 # \ 跟元字符组合取消特殊功能,跟部分普通字符组合具有特殊功能。 #表示一个字符 # \d [0,9] # \D [^0-9] # \s 任何空白字符[\t\t\r\f\v] # \S 任何非空白字符[\t\t\r\f\v] # \w 字母数字 [a-z,A-Z,0-9] # \W 非字母数字 [^a-z,A-Z,0-9] # \b 匹配一个特殊边界 ret = re.findall("\d{11}","aab1233558544456454554545") print(ret) #['12335585444', '56454554545'] ret = re.findall("\wasd","aab12335585asd") print(ret) #['5asd'] ret = re.findall(r"I\b","I an a person Info") print(ret) #['5asd'] # 正则表达式方法。 # re.findall() 返回所有找到的结果列表 # re.search() 返回第一个结果对象,通过group()方法返回结果内容 # re.match() 只在字符串开始匹配,
规则集
规则 |
匹配 |
例子 |
备注 |
/a/ |
含有字母a的句子 |
Hello,Mary |
只能匹配单个字符或字符串,区分大小写。 |
/[wW]ood/ |
匹配满足中括号内的任意一个字符 |
Hello,wood. |
中括号中只占一个占位符。可以用a-z表示小写字母。0-9表示数字。 |
/[^A-Z]/ |
^表示非的意思,只要不是大写字母都满足。 |
Nice to meet you.
|
^在[]开头表示非, 在句首表示句子以什么开始。 在句中或句尾则表示普通字符^。例如[a^b]表示a或^或b |
/^The/ |
匹配满足以The开始的句子 |
||
/th^e/ |
只是表示字符^ |
||
/^The dog\.$/ |
$表示句子结尾 |
The dog. |
在正则表达式中,\表示转义字符。\.表示. 该例子表示仅匹配The dog.字符串。 |
/colou?r/ |
?表示前一个字符可或前一个表达式有可无。 |
I like the color |
|
/a*/ |
*表示重复的意思,表示0个或多个前一个规则集。 |
banana |
若要表示一个或多个a则用aa* [ab]*可表示aaa,abab,bbb等。 |
/[0-9]+/ |
+表示至少有一个。 |
100 |
[0-9]+ 可表示至少一个数字 |
/beg.n/ |
.表示任意一个字符。 |
begin |
.只是一个占位符,可用[.]+表示只要有一个任意字符。 [.]*表示前后有0个或多个字符。 |
/\b99\b/ |
\b表示字符边界, \B表示非字符边界 |
There are 99 boxes They are 299 It is $99. |
满足第一个句子因为两边有空格边界,不满足299,因为没有边界。满足$99 \B的用法与之相反 |
/cat|dog/ |
满足cat 或者dog |
I have a cat |
|表示或者的意思 |
/gupp(y|ies)/ |
()优先级高于| |
guppy, |
|
/\d/ ==> /[0-9]/ |
表示任意数字 |
|
|
/\D/ ==> /^[0-9]/ |
表示非数字 |
|
|
/\w/ ==> /a-zA-Z0-9_/ |
表示字母数字下划线 |
|
|
/\W/ |
表示非字母数字下划线 |
|
|
/\s/ |
空格,\r \t\n\f |
|
|
/\S/ |
非手写字符 |
|
|
/\w{10}/ |
{}表示数量,上例表示匹配字母数字下划线10位字符。 |
|
{}有四种形式 {n},{n,m},{n,}{,m} 代表匹配字符串的数量范围。 |
/\*/ |
表示转义字符,仅表示*字符 |
|
|
正则表达式原则
1优先级:() > *+?{} > ^ $ > |。正则表达式满足优先级序列。例如/the*/ 匹配thee 而不是匹配thethe。/the|any/匹配的是the 或者 any ,而不是theny 或 thany。
2正则表达式满足贪心原则。例如/[a-z]*/匹配abcd123,最终搜索结果是abcd而不是a,ab等。可以使用*?和+?表示匹配最短的字符。