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等。可以使用*?和+?表示匹配最短的字符。

 

posted @ 2020-12-26 18:37  一笑任逍遥  阅读(20)  评论(0编辑  收藏  举报