python正则表达式

在python中,正则是一个引过来的模块,叫re模块
就本质来说,正则表达式是一种小型的,高度专业化的编程语言,内嵌在python中
正则的作用简单来说就是模糊匹配,而且只对字符串处理,而且由于它是由C编写的所以运行速度特别的快
1、普通字符:大多数字符和字母都会和自身匹配

>>>import re
>>>re.findall('yibole','asdafalajyiboleasdaswvxcvse'
['yibole']

2、元字符: . ^ $ * + ? {} [] | ()
.点是通配符,除了换行符\n不行其他的字母、数字,都能匹配到,一个点代表一个符号,两个点代表

re.findall("a..x"."ajhxqrqoijvlkwejr")

^是以什么开头的意思,只能在字符串开头去匹配内容:

re,findall("^as..x","asqqxasdwqfdfa")

$是以什么什么结尾,只能在字符串的末尾去匹配

re,findall("as..x$","asqqxasdwqfdfaasrrx")

*的意思是范围(0,正无穷)
+的意思是范围(1,正无穷)

>>> re.findall("yibole*","ajndqwjnyasqwwyibol")
['yibol']
>>> re.findall("yibole+","ajndqwjnyasqwwyibol")
[]

?的意思是范围(0,1)它可以匹配0次或者1次

>>> re.findall("yibole?","ajndqwjnyyibolq")
['yibol']

{}大括号代表可以写一个范围,{0,正无穷}*,{1,正无穷}+,{0,1}==?,{6}就是循环6次

>>> re.findall("yibole{2,5}","ajndqwjnyyiboleeeq")
['yiboleee']

前面的+*?都是贪婪匹配,如果想变成惰性匹配就需要在后面加一个?就行了

>>> re.findall("yibole*?","qweqweyiboleee")
['yibol']
>>> re.findall("yibole+?","qweqweyiboleee")
['yibole']

字符集[]:[]的第一个意思是或的意思,这里为yi开头中间b或o之后以le结尾

>>> re.findall("yi[bo]le","asfjqwyibleyioleyibole")
['yible', 'yiole']

其次,在[]中没有特殊符号

>>> re.findall("yi[b*o]","asfjqwyeyibbbbbbbbb")
['yib']
>>> re.findall("yi[b*o]","asfjqwyeyibbbbyi*")
['yib', 'yi*']

但是在中括号内写[a-z]是指a到z所有的小写字母,加上*就是取q后面所有的a-z的内容,它是按照ascii码来排序的,所以如果需要a-Z就在括号中写入[a-Z]就可以了

>>> re.findall("q[a-z]*","aafaewqqqwewe")
['qqqwewe']

如果在字符集中加入后,比如[a-z],意思就是非,代表不是a-z就可以匹配了

>>> re.findall("q[^a-z]","qweq123qq")
['q1']

在字符集中的\是转译符,可以让有意义的变成无意义,无意义变成有意义的:

>>> re.findall("\([^()]*\)","(1+2+(1-2)")
['(1-2)']

\d匹配任何十进制数,他相当于类[0-9]
\D匹配任何非数字字符,他相当于[^0-9]
\s匹配任何空白字符,相当于[\t\n\r\f\v]
\S匹配任何非空白字符,相当于[^\t\n\r\f\v]
\w匹配任何数字字母字符,相当于[a-zA-Z0-9_]
\W匹配任何非字母数字字符,相当于[^a-zA-Z0-9_]
\b匹配特殊字符边界,比如空格,&,#等

>>> re.findall("\d+","(11+22+(1-2)")
['11', '22', '1', '2']
>>> re.findall("\D+","(11+22+(1-2)")
['(', '+', '+(', '-', ')']
>>> re.findall("\s+","hello world")
[' ']
>>> re.findall("\S+","hello world")
['hello', 'world']
>>> re.findall("\w+","hello world")
['hello', 'world']
>>> re.findall("\W+","hello world")
[' ']

但是转义字符\在python中和re中有相同的作用,所以在使用中如果需要匹配字符串中带有\的字符,就需要两次转义,或者在字符串前写上r让python编译器不转义:

>>> re.findall("I\\b","I AM LIST")
['I']
>>> re.findall(r"I\b","I AM LIST")
['I']

|是或的意思,()是分组

>>> re.findall(r"ka|ab","asfsaabdka")
['ab', 'ka']
>>> re.findall("(abc)+","abcawdabc")
['abc', 'abc']

匹配时不仅可以使用findall还可以使用search,findall是把字符串中所有正确匹配的数全部取出来,而search查询到第一个正确的值之后后面的就不再查询了,而匹配成功了之后把这个对象的值取出来就需要用group:

>>> re.search("\d+","asdafasdasd34asdw555").group()
'34'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值