本文主要介绍python中正则表达式的基本用法,做一个初步的认识。

1. 初识

python通过re内置模块来处理正则表达式(regex),底层使用C引擎。一个简单的正则匹配的例子:

import re
# 正则
p = re.compile(r'[a-zA-Z0-9]')
s = 'hello 123, world!'
print re.findall(p,s) # 输出:
# ['h', 'e', 'l', 'l', 'o', '1', '2', '3', 'w', 'o', 'r', 'l', 'd']

元字符:所谓元字符,指的是那些不仅仅可以表示字符本身含义、并且还可以表示其他特殊含义的字符。正则中的元字符主要有如下这些:

. ^ $ * + ? { } [ ] \ | ( )

要在正则中匹配元字符本身,需要使用转义符号,比如如果要匹配"+"符号,则在正则中要写成:"\+".

2. 正则元字符含义解释

1. [ ]

(1) 常用来指定一个字符集,如[abc]匹配:a或b或c

(2) 元字符在"[]"中不起所用,比如:[a+]匹配:a或+

但注意:在方括号中要匹配转义符“\”本身,要用:"\\";要匹配方括号开头的"^"符本身,要用:"^";要匹配"-"字符,需要用:"\-"

(3) 补集匹配:[^a],匹配非a的一个字符

(4) 匹配连续字符:[a-zA-Z0-9],匹配大小写英文字母和数字

2. ^

匹配行首,在MULTILINE模式中,直接匹配字符串中的每一个换行。

3. $

匹配行尾,行尾是指:字符串尾,或一个换行字符后的任何位置。

4. \

转义字符,如果要匹配""本身,需要使用再次转义:"\\"。

一些特殊字符:

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

5. *

匹配前一个字符或子表达式出现0次或多次。

6. +

匹配前一个字符或子表达式出现1次或多次。

7. ?

(1) 匹配前一个字符或子表达式出现1次或0次。

(2) 表示非贪婪匹配:

import re
# 贪婪模式,会尽量多地去匹配
r1 = re.compile(r'ab+')
s1 = 'abbb'
print re.findall(r1,s1) # 非贪婪模式,会尽量少地去匹配
r2 = re.compile(r'ab+?')
s2 = 'abbb'
print re.findall(r2,s2) # 输出:
'''
['abbb']
['ab']
'''

8. {}

匹配前一个字符或子表达式出现指定次数:

  • {0,}:0次或多次,相当于"*"

  • {1,}:1次或多次,相当于"+"

  • {0,1}:0次或1次,相当于"?"

  • {m,n}:m次到n次(m <= n)

随机推荐

  1. Web渗透实验:基于Weblogic的一系列漏洞

    1. 攻击机windows10 192.168.2.104 2. 靶机ip: 192.168.2.109(linux Ubantu) 192.168.2.111(windows2008R264位) 第 ...

  2. 分布式服务框架 Zookeeper(三)官方入门指南

    入门指南:使用ZooKeeper来协调分布式应用 这篇文档包含了让你快速上手ZooKeeper的信息.主要是针对那些想要试一把ZooKeeper的开发人员,包含了安装一个单一ZooKeeper服务器的 ...

  3. 微信强大的demo

    https://github.com/xialeistudio/wechatPublicPlatform

  4. 2015 Spark 将走向哪里?

    在刚刚过去的spark submit上,Matei Zahara简单回顾了下2014年spark的发展,可用一个词来概括那就是"Amazing"!!! 那么2015年,spark ...

  5. Quartz定时任务学习(三)属性文件和jar

    以下是我在应用的的一个基本配置: #---------调度器属性----------------org.quartz.scheduler.instanceName = TestSchedulerorg ...

  6. iOS开发笔记--如何实现程序长时间未操作退出

    我们使用金融软件经常会发现手机锁屏或者长时间未操作就会退出程序或者需要重新输入密码等情况.下面让我们看一下如何实现这种功能.我们知道iOS有一个事件循环机制,也就是大家所说的runloop.我们在对程 ...

  7. 队列实现 (双向循环链表 C++)

    队列是非常easy的.可是用数组实现可能更好点. . (事实上我认为数组在多个队列的时候更难) 然后我是第一次写双向循环链表.指向太乱了. 我这里是依照自己的想法.建立了一个头节点,一个尾节点,然后依 ...

  8. 【spring boot logback】spring boot中logback日志乱码问题

    在初次使用logback的自定义配置文件完整的控制spring boot日志后,发现了一个无法忍受的问题,就是日志乱码. 控制台看到打印日志乱码如下: 而日志文件打开: 记事本打开 sublime打开 ...

  9. svn 更新文件冲突,提示中文乱码解决

    问题描述: update 操作提示错误信息,中文乱码 和 “Please execute the 'Cleanup' command.” Cleanup 操作报错: 解决办法: 1. 工具下载(sql ...

  10. 【BZOJ3083/3306】遥远的国度/树 树链剖分+线段树

    [BZOJ3083]遥远的国度 Description 描述zcwwzdjn在追杀十分sb的zhx,而zhx逃入了一个遥远的国度.当zcwwzdjn准备进入遥远的国度继续追杀时,守护神RapiD阻拦了 ...