首页 > 编程语言 > 详细

python学习笔记之---正则表达式

时间:2019-10-31 10:00:46      阅读:84      评论:0      收藏:0      [点我收藏+]
正则:一些字符串,可以实现模糊的匹配 
regular expression
常用的场景:爬虫、分析日志
#正则的包
 >>> import re
 
#match:开头匹配,匹配到,返回一个匹配对象,否则返回None
>>> re.match("abc","abcd")
<_sre.SRE_Match object; span=(0, 3), match=‘abc‘>#返回的是一个匹配对象,要想查看匹配的内容用group(),search也是
>>> result =re.match(r"\d","dbja1")
>>> type(result)
<class ‘NoneType‘>  #没有匹配返回None
>>>

 

#\d(digit):匹配所有的数字
>>> re.match("\d","1abcd")
<_sre.SRE_Match object; span=(0, 1), match=‘1‘>
>>> re.match("\\d","1abcd")
<_sre.SRE_Match object; span=(0, 1), match=‘1‘>
>>> re.match(r"\d","1abcd")#加r转移符,写一个\,防止在文件里转译出错
<_sre.SRE_Match object; span=(0, 1), match=‘1‘>
>>>
 
 
#search:从任意位置找到第一个,只返回第一个匹配到的,匹配不到返回None
>>> re.search(r"\d","acb3ad")
<_sre.SRE_Match object; span=(3, 4), match=‘3‘>
>>>
>>> re.search(r"\d","acb3ad3l3sd4")
<_sre.SRE_Match object; span=(3, 4), match=‘3‘>
>>>
 
 
#findall:找到所有匹配的内容放到一个列表里,匹配不到时返回一个空的列表。
>>> re.findall(r"\d","a1b2c3")  #匹配到所有的数字,放到一个列表里返回
[‘1‘, ‘2‘, ‘3‘]
>>>
>>> re.findall(r"\d","abc")  #没匹配到返回一个空列表
[]
>>>
>>> result =re.findall(r"\d","a1b2c3")
>>> result
[‘1‘, ‘2‘, ‘3‘]
>>>
 
 
#因为match和search返回的是一个匹配对象,如果想查看匹配到的具体内容用时group()
>>> result =re.match(r"\d","2bg")
>>> result.group()
‘2‘
>>> result 
<_sre.SRE_Match object; span=(0, 1), match=‘2‘>
>>> result =re.search(r"\d","d2bg")
>>> result
<_sre.SRE_Match object; span=(1, 2), match=‘2‘>  #返回的是一个匹配对象
>>> result.group()  #用group查看返回内容
‘2‘
>>> result =re.search(r"\d","dbg")
>>> result
>>> result.group()#注意:没有匹配到内容时不能用group
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: ‘NoneType‘ object has no attribute ‘group‘
>>>
 
 
 
#compile编译正则表达式,存到一个变量里方便复用
>>> pattern =re.compile(r"\d")
>>> type(pattern)
<class ‘_sre.SRE_Pattern‘>
>>> pattern.match("1ab")
<_sre.SRE_Match object; span=(0, 1), match=‘1‘>
>>> pattern.search("dd1ab")
<_sre.SRE_Match object; span=(2, 3), match=‘1‘>
>>> pattern.search("dd1ab").group()
‘1‘
>>> pattern.findall("344")
[‘3‘, ‘4‘, ‘4‘]
 
 #练习:
>>> s=input("请输入一些内容:")
请输入一些内容:I am ok!
>>> if re.search(r"ok",s):  #返回的是一个匹配对象,只要不是None就会认为是True,True就会执行if语句。
...     print(True)
... else:
...     print(False)
...
True
>>> s=input("请输入一些内容:")
请输入一些内容:aaaaa
>>> if re.search(r"ok",s):
...     print(True)
... else:
...     print(False)
...
False
 
 
 
\d\D:digit,匹配数字,非数字,大写表示取反
>>> re.search(r"\d","rw3e").group()  #匹配数字
‘3‘
>>> re.search(r"\D","rw3e").group()  #匹配非数字
‘r‘
>>>
 
 
\w\W:word 匹配所有的大小写字母和数字,非字母非数字;
[a-zA-Z_0-9]
>>> re.search(r"\w","  a").group()
‘a‘
>>> re.search(r"\w","  a").group()
‘a‘
>>> re.search(r"\w","  1").group()
‘1‘
>>> re.search(r"\W","_  1").group()
‘ ‘
>>> re.search(r"\W","_").group()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: ‘NoneType‘ object has no attribute ‘group‘
>>> re.search(r"\W","@").group()
‘@‘
>>> re.search(r"\W","!!@").group()
‘!‘
>>> re.findall(r"\w","中国")
[‘中‘, ‘国‘]
 
 
 
 
 \s\S:space  匹配所有的空白,非空白
 >>> re.search(r"\s","\t").group()
‘\t‘
>>> re.search(r"\s"," ").group()
‘ ‘
>>> re.search(r"\S","  ! ").group()
‘!‘
>>> re.search(r"\S"," %$2a  ").group()
‘%‘
 
 
量词:+,?,*,{},{m,n}
+:表示匹配一个或多个内容 ,
尽量多的配置,
正则表示式的贪婪性
 
>>> re.search(r"\d+","abc123 1").group()
‘123‘
>>> 
>>> re.search(r"\s+","\r\t\n 1").group() #+,正则的贪婪性,尽可能多的匹配
‘\r\t\n ‘
>>> re.search(r"\s+?","\r\t\n 1").group() #?,抑制贪婪性,尽可能少的匹配
‘\r‘
>>> re.findall(r"\d+","dbw2223ojds9jdkew1")
[‘2223‘, ‘9‘, ‘1‘]
>>> re.findall(r"\d+?","dbw2223ojds9jdkew1")  #
[‘2‘, ‘2‘, ‘2‘, ‘3‘, ‘9‘, ‘1‘]
 
 
 
 *:匹配0个或多个
 >>> re.search(r"\d*","we333").group()  #正则表达式都是从第一个字符开始匹配的,第一个“w”不满足\d匹配到了0次,符合\d*匹配0个,所以返回了
‘‘
>>> re.search(r"\d","we333").group()
‘3‘
>>> re.search(r"\w*","ab123 1").group()   #匹配到了多个
‘ab123‘
 
 
 
 {}:指定匹配次数
>>> re.search(r"\d{3}","12  123  34").group()
‘123‘
>>> re.search(r"\d{1,3}","12  123  34").group()  #指定范围
‘12‘
>>> re.search(r"\d{1,}","12 123 34 0").group()  #后面不写范围,表示匹配大于等于1次的
‘12‘
 
 
?:表示匹配0次或一次
>>> re.search(r"\d?","123a").group()
‘1‘
>>> re.search(r"\d?","dd123a").group()  #从开头匹配,字符串“d”不满足\d的数字匹配,也满足?匹配0次的规则,所以返回了
‘‘
>>>
>>> re.findall(r"\d?","ff2123a")   #每一个字符都做了一个匹配,匹配不到返回空,匹配到了放回内容,放到一个列表里
[‘‘, ‘‘, ‘2‘, ‘1‘, ‘2‘, ‘3‘, ‘‘, ‘‘]
>>>
 
 
 
.匹配非空格、非回车之外的所有字符,匹配的是一个字符
>>> re.search(r"a.b","a1b").group()
‘a1b‘
>>>
 
 
抑制贪婪性
>>> re.search(r"a.*b","a1  db   123b").group()   #.表示匹配ab之间的一个字符,如a1b,加一个*(.*)表示匹配ab之间可以有0个或多个字符都成立,即匹配a和b之间的所有内容
‘a1  db   123b‘
>>> re.search(r"a.*b","ab").group()
‘ab‘
>>> re.search(r"a.*b","ab a1b a89 b").group()
‘ab a1b a89 b‘
>>> re.search(r"a.*?b","a1  db   123b").group()  #加个?抑制贪婪性
‘a1  db‘
>>>
 
 
 
 总结:
match
search
findall
group
\d\D
\w\W
\s\S
* + . ?
{m,n}
 
\w 匹配字母数字及下划线
\W 匹配f非字母数字下划线
\s 匹配任意空白字符,等价于[\t\n\r\f]
\S 匹配任意非空字符
\d 匹配任意数字
\D 匹配任意非数字
\A 匹配字符串开始
\Z 匹配字符串结束,如果存在换行,只匹配换行前的结束字符串
\z 匹配字符串结束
\G 匹配最后匹配完成的位置
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配字符串的开头
$ 匹配字符串的末尾
. 匹配任意字符,除了换行符,re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符
[....] 用来表示一组字符,单独列出:[amk]匹配a,m或k
[^...] 不在[]中的字符:[^abc]匹配除了a,b,c之外的字符
* 匹配0个或多个的表达式
+ 匹配1个或者多个的表达式
? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
{n} 精确匹配n前面的表示
{m,m} 匹配n到m次由前面的正则表达式定义片段,贪婪模式
a|b 匹配a或者b
() 匹配括号内的表达式,也表示一个组
 

python学习笔记之---正则表达式

原文:https://www.cnblogs.com/wenm1128/p/11757047.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!