re.findall
re.findall(pattern,string,flags=0)
前面为正则表达式,后面为要检索的字符串,返回一个列表(如果检索到值多次出现,则该列表含有多个相同值)。
第三个参数为匹配模式,默认匹配模式为0。re.I表示忽略大小写,re.S表示‘.’可以匹配一切字符。模式之间可以并存,用‘|’来分隔。例如re.findall(regular_expression,str,re.I | re.S)
一
a='Python\C\Java'
b='Python'
print(re.findall(b,a))
['Python']
二
a='PYH\n\n\n'
b='pyh...'
r=re.findall(b,a,re.I | re.S)
print(r)
['PYH\n\n\n']
三
a='PYH\n\n\n'
b='pyh...'
r=re.findall(b,a,re.I)
print(r)
[]
.
.
.
正则表达式的灵魂在于它的规则
.
.
.
正则表达式 | 代表的匹配字符 |
---|---|
[0-9] | 0123456789任意之一 |
[a-z] | 小写字母任意之一 |
[A-Z] | 大写字母任意之一 |
\d | 等同于[0-9] |
\D | 等同于[^0-9]匹配非数字 |
\w | 等同于[a-z0-9A-Z_]匹配大小写字母、数字和下划线 |
\W | 等同于[^a-z0-9A-Z_]等同于上一条取非 |
\s | 空白字符,例如\t,\n |
. | 除换行符\n之外其他所有字符 |
.
.
.
‘python’为普通字符,’\d’为元字符。
.
.
.
import re
a='abc,acc,auc,akc,ahc'
r=re.findall('a[ch]c',a)
print(r)
['acc', 'ahc']
普通字符常用于定界。中括号里面的字符为 ‘或 ’的关系。
.
.
.
[^]表示取反,‘非’。
.
.
.
import re
a='abc,acc,auc,akc,ahc'
r=re.findall('a[b-h]c',a)#一个范围
print(r)
['abc', 'acc', 'ahc']
.
.
.
数量词的表示
* | 匹配前一个字符0次至无限次 |
---|---|
+ | 匹配前一个字符1次至无限次 |
? | 匹配前一个字符0次或1次 |
{number1,number2} | 匹配前一个字符number1至number2次(默认贪婪) |
() | 一个括号括起来的内容表示一组,字符之间为‘且’的关系,要全部出现 |
[] | 一个中括号括起来,里面的字符之间为‘或’的关系 ,出现一个就行 |
.
.
.
?前面是范围时表示非贪婪,前面是字符时作为数量词
a='abcdef'
r=re.findall('[a-z]{2,4}',a)
print(r)
r=re.findall('[a-z]{2,4}?',a)
print(r)
['abcd', 'ef']
['ab', 'cd', 'ef']
.
.
.
^ | 表示字符串的开始,从字符串的开头向后进行匹配 |
---|---|
$ | 表示字符串的末尾,从字符串的末尾往前进行匹配 |
.
.
.
re.sub
re.sub(pattern, repl, string, count=0, flags=0)
返回修改后的字符串。
count表示“最大的替换次数”,0表示无限多次。
flags为匹配模式。
repl可以是一个字符串,也可以是一个函数。
若是一个函数,则传入该函数的是一个对象。
一
str='i am a boy'
pattern='boy'
new_str=re.sub(pattern,'girl',str)
print(new_str)
i am a girl
二
<re.Match object; span=(7, 10), match='boy'>#span为匹配到的字符串的第一个字符的序号和最后一个字符的序号加一(类似于切片),match是匹配到的字符串。该函数如果不返回一个值,则源字符串对应的位置会被清空;若返回一个值,该值将替代匹配到的字符串。
三
def function(value):
return 'girlll'
str='i am a boy'
pattern='boy'
new_str=re.sub(pattern,function,str)
print(new_str)
i am a girlll
四
group()方法可以提出截获的字符串
str.replace
str.replace(old, new[, count])
返回字符串的副本,其中出现的所有子字符串 old 都将被替换为 new。 如果给出了可选参数 count,则只替换前 count 次出现。
性能比re.sub弱很多,只能实现简单的字符串的替换,不能使用正则表达式
.
.
.
re.match
re.match(pattern, string, flags=0)
如果 string 开始的0或者多个字符匹配到了正则表达式样式,就返回一个相应的 匹配对象 。 如果没有匹配,就返回 None ;注意它跟零长度匹配是不同的。
注意即便是 MULTILINE 多行模式, re.match() 也只匹配字符串的开始位置,而不匹配每行开始。
如果你想定位 string 的任何位置,使用 search() 来替代(也可参考 search() vs. match() )
也就是说,它只匹配字符串的开头。只匹配一次。
re.search
re.search(pattern, string, flags=0)
扫描整个 字符串 找到匹配样式的第一个位置,并返回一个相应的 匹配对象。如果没有匹配,就返回一个 None ; 注意这和找到一个零长度匹配是不同的。
也就是说,它遍历整个字符串。只匹配一次。
re.serch和re.match都只匹配一次,不同于re.findall会把所有的都找出来。前两者返回一个对象,后者返回一个列表。flags都是匹配模式。
.
.
.
.
.
.
Match.group()
一:概念
二:
search和findall的一个小比较
import re
string='life is short ,and i will not be sad.'
pattern='life(.*)sad'
r=re.search(pattern,string)
print(r.group(1))
is short ,and i will not be
string='life is short ,and i will not be sad.'
pattern='life(.*)sad'
r=re.findall(pattern,string)
print(r)
[' is short ,and i will not be ']
三:group()的分组
import re
string='life is short ,and i will not be sad,and i am happy now'
pattern='life(.*)sad(.*)now'
r=re.search(pattern,string)
print(r.group(0))
print(r.group(1))
print(r.group(2))
print(r.group(0,1,2))
life is short ,and i will not be sad,and i am happy now
is short ,and i will not be
,and i am happy
('life is short ,and i will not be sad,and i am happy now', ' is short ,and i will not be ', ',and i am happy ')
0表示全部返回,1表示第一个分组,2表示第二个…如果有多个分组,就返回一个元组。
.
.
.
Match=groups()
和group()不同,它只返回所有匹配的子组,没有匹配到的就返回一个None,我们可以修改这个None的表示。
.
.
.
我是热爱编程的小云同学,有问题一起交流哦~~~~~~