元字符:

*  星号   它指定前一个字符可以被匹配零次或更多次

>>> re.match('a[bcd]*b', 'abcbdabcd').group()
'abcb'
>>> re.match('a[bcd]*b', 'abcbdbcd').group()
'abcbdb'
>>>

匹配a和b之间的字符,如果有,那么继续直到没有为止。所以它是贪婪匹配。

如果a和b之间有字符,但是不是bcd中的任意一个那么将会停止,取到上次匹配的结果。

+  加号   指定前边的字符一次或者更多次。区别于 * 的是,至少需要一次。

>>> re.match('c+t', 'ctct').group()
'ct'
>>> re.match('c+t', 'tct').group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
>>>

+  是非贪婪匹配。只要满足条件找到一个就结束。

?  问号   匹配一次或零次  可以认为它用于标识某事物是可选的。例如:home-?brew 匹配 "homebrew" 或 "home-brew"。

>>> re.match('www-?mmm', 'www-mmm').group()
'www-mmm'
>>> re.match('www-?mmm', 'wwwmmm').group()
'wwwmmm'
>>>

可以看到有无 - 减号都可以

最复杂的重复限定符是 {m,n}(注意m,n之间不能有空格),其中 m 和 n 是十进制整数。

该限定符的意思是至少有 m 个重复,至多到 n 个重复。

举个例子,a/{1,3}b 将匹配 "a/b","a//b" 和 "a///b"。它不能匹配 "ab" 因为没有斜杠,也不能匹配 "a////b" ,因为有四个。

>>> re.match('a/{1,3}b', 'a/b').group()      #一个斜杠
'a/b'
>>> re.match('a/{1,3}b', 'ab').group() #没有斜杠
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
>>> re.match('a/{1,3}b', 'a////b').group() #四个斜杠
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
>>>

细心的读者也许注意到其他三个限定符都可以用这样方式来表示。

{0,}  等同于 *,{1,}  等同于 +,而 {0,1} 则与 ? 相同。

如果可以的话,最好使用 *,+,或?。很简单因为它们更短也更容易懂。

.    点号    匹配任何除了换行以外的字符,在 alternate 模式(re.DOTALL)下它甚至可以匹配换行。

系统预设特殊字符:

\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_]。

分组:

>>> re.match('(a(b(c)))d', 'abcd').group()
'abcd'
>>> re.match('(a(b(c)))d', 'abcd').group(0)
'abcd'
>>> re.match('(a(b(c)))d', 'abcd').group(1)
'abc'
>>> re.match('(a(b(c)))d', 'abcd').group(2)
'bc'
>>> re.match('(a(b(c)))d', 'abcd').group(3)
'c'
>>>

我们可以看出,这是典型的剥洋葱模式。从外层开始,一层一层向内。最内层的分组将依次被放在从索引为0开始的一个_sre.SRE_Match object中。

 

最新文章

  1. JavaMail发送邮件
  2. 9月9日HTML上午表单元素2(框架、样式表)
  3. H5版俄罗斯方块(3)---游戏的AI算法
  4. 理解模数转换器的噪声、ENOB和有效分辨率
  5. C++学习31 重载=(赋值运算符)
  6. LOL是什么意思? - 已解决 - 搜狗问问
  7. 但从谈论性能点SQL Server选择聚集索引键
  8. fpm 制作 rpm 包
  9. transform 的副作用
  10. pymysql的使用
  11. python之log
  12. js的逆向解析
  13. MVC项目加入WebApi
  14. pip install 安装出现问题:UnicodeEncodeError: &#39;ascii&#39; codec can&#39;t encode characters in position XX的解决办法
  15. SQL SERVER 常见SQL和函数使用
  16. [转]正则表达式的先行断言(lookahead)和后行断言(lookbehind)
  17. 怎样使用 fiddler抓取网络数据包?
  18. 【从0到1学jQuery】jQuery中each()和$.each()的使用
  19. 漫画 | Java多线程与并发(一)
  20. 线状地物图斑化全流程作业(使用ArcMap软件)

热门文章

  1. mysql:查询数据库版本的几种方式
  2. 06 Counting Point Mutations
  3. 关于如何在服务器上搭建tomcat并发布自己的web项目
  4. 【转载】Zookeeper 安装和配置
  5. Linux中找不到service命令
  6. Android开发之深入理解NFC(一)
  7. scalaWindows和Linux搭建
  8. [教学] Log.d 日志调试查看(所有平台)
  9. vmware虚拟机监控数据
  10. Spring各个jar包详解