正则表达式和re模块
re的元字符
import re
ret = re.findall("e..a", "Hermaeus") #"."是模糊表示一个字符
print(ret)
['erma']
ret = re.findall("^H..m", "Hermaeus") #"^"表示开头必须是某个字符
print(ret)
['Herm']
ret = re.findall("a..s$", "Hermaeus") #"$"表示结尾必须是某个字符
print(ret)
['aeus']
ret = re.findall("abc*", "abccccc") #贪婪匹配[0,+∞]
print(ret)
['abccccc']
ret = re.findall("abc+", "abccccc") #贪婪匹配[1,+∞]
print(ret)
['abccccc']
ret = re.findall("abc?", "abccccc") #惰性匹配[0,1]
print(ret)
['abc']
ret = re.findall("abc{1,3}", "abccccc") #贪婪匹配[1,3]
print(ret)
['abccc']
ret = re.findall("abc*?", "abccccc") #这样会让其变成惰性匹配
print(ret)
['ab']
字符集[ ]
即在字符集中任意匹配一个
import re
ret = re.findall("a[bc]", "abc")
print(ret)
['ab']
ret = re.findall("[a-z]", "ahfao")
print(ret)
['a', 'h', 'f', 'a', 'o']
ret = re.findall("[%$]", "ada%jf$") #在字符集里面除了:- ^ \以外都是普通字符
print(ret)
['%', '$']
##" - " 取在这之间的
ret = re.findall("[1-9]", "1jkah1k2k3j")
print(ret)
['1', '1', '2', '3']
##" ^ " 取反,即在这字符集里面没有的
ret = re.findall("[^ab]", "7ajkf2bfjab")
print(ret)
['7', 'j', 'k', 'f', '2', 'f', 'j']
##" \ " 转义符
ret = re.findall("[\d]", "45dhaf2")
print(ret)
['4', '5', '2']
转义符
- 反斜杠后边跟元字符去除特殊功能,比如
\.
- 反斜杠后边跟普通字符实现特殊功能,比如
\d
\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
匹配一个特殊字符边界,比如空格 ,&,#等
import re
ret = re.findall(r"I\b", "I am LIST") ##添加"r",就变成了原生字符串,它表示把需要匹配的字符集直接交给模块处理
print(ret)
分组 ( )
import re
ret = re.search("(?P<id>\d{2})/(?P<name>\w{3})", "23/com") #"?P<id> 取名
print(ret)
<_sre.SRE_Match object; span=(0, 6), match='23/com'> #返回一个对象
print(ret.group())
23/com
print(ret.group("id"))
23
|
符号
import re
ret = re.search("(ab)|\d", "rabjk4fk") #二选一
print(ret)
print(ret.group())
re下的常用方法
import re
#findall()方法
#返回所有满足匹配条件的结果,放在列表里
re.findall('a','alvin yuan')
#search()方法
#函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以;通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
re.search('a','alvin yuan').group()
#match()方法
#同search,不过尽在字符串开始处进行匹配
re.match('a','abc').group()
#split()方法
#先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
ret=re.split('[ab]','abcd')
print(ret)#['', '', 'cd']
#sub()和subn()方法
#替代
ret=re.sub('\d','abc','alvin5yuan6',1)
print(ret)#alvinabcyuan6
#替代,且可以选择次数
ret=re.subn('\d','abc','alvin5yuan6')
print(ret)#('alvinabcyuanabc', 2)
#compile()方法
#对象赋予
obj=re.compile('\d{3}')
ret=obj.search('abc123eeee')
print(ret.group())#123
#finditer()方法
ret=re.finditer('\d','ds3sy4784a')
print(ret) #<callable_iterator object at 0x10195f940>
#返回迭代器
print(next(ret).group())
print(next(ret).group())
注意:
import re
ret=re.findall('www.(baidu|oldboy).com','www.oldboy.com')
print(ret)['oldboy'] #这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
['oldboy']
ret=re.findall('www.(?:baidu|oldboy).com','www.oldboy.com')
print(ret)
['www.oldboy.com']
分组
在正则表达式中,可以对过滤到的字符串进行分组,分组使用圆括号的方式:
group
:和group(0)
等价,返回的是整个满足条件的字符串groups
:返回的是里面的子组,索引从1开始group(1)
:返回的是第一个子组,可以传入多个
代码实例:
import re
text = "apple price is $99,orange price is $10"
ret = re.search(r".*(\$\d+).*(\$\d+)",text)
print(ret.group())
print(ret.group(0))
print(ret.group(1))
print(ret.group(2))
print(ret.groups())
'''
result:
apple price is $99,orange price is $10
apple price is $99,orange price is $10
$99
$10
('$99', '$10')
'''