正则表达式,Re模块 学习笔记之一

1、 正则表达式元字符

正则表达式元字符由普通字符、元字符组成。
普通字符是正常的文本符号,具有字符的本来含义。元字符(metacharacter)具有特定的含义。
下面列举一些正则表达式里的元字符及其作用

元字符 说明
. 代表任意字符
| 逻辑或操作符
[ ] 匹配内部的任一字符或子表达式
[^] 对字符集和取非
- 定义一个区间
\ 对下一字符取非(通常是普通变特殊,特殊变普通)
* 匹配前面的字符或者子表达式0次或多次
*? 惰性匹配上一个
+ 匹配前一个字符或子表达式一次或多次
+? 惰性匹配上一个
? 匹配前一个字符或子表达式0次或1次重复
{n} 匹配前一个字符或子表达式
{m,n} 匹配前一个字符或子表达式至少m次至多n次
{n,} 匹配前一个字符或者子表达式至少n次
{n,}? 前一个的惰性匹配
^ 匹配字符串的开头
\A 匹配字符串开头

$匹配字符串结束

[\b] 退格字符
\c 匹配一个控制字符
\d 匹配任意数字
\D 匹配数字以外的字符
\t 匹配制表符
\w 匹配任意数字字母下划线
\W 不匹配数字字母下划线
\b 匹配单词头或者单词尾。

元字符的一些说明:

1.[^]代表除了内部包含的字符以外都能匹配在,例如:b[^abc]t , 将匹配除了bat,bbt,bct之外的任意b*t文本,比如:bqt。 在[]字符不起作用,都代表字符本身的含义。例如:[abc ], 将匹配 ’a’ ,’b’,’c’, ‘$’ 中的任意一个字符。
2.规定重现次数的范围:
{n,m} , n-m次。{4,} 匹配四次及4次以上。
\b{6}\b , 匹配正好6个字母的单词。
3 .具体的举例

  • 匹配电话号码:\d{3}-\d{8}|\d{4}-\d{7}, 例如:021-81888822或者0731-1234567
  • 匹配账号合法性:(设账号以字母开头,包括5-16个字符):^[a-zA-Z][a-zA-Z_]{4,15}$
  • 匹配qq号。[1-9][0-9]{4,} .匹配10000开始的。10000,100001,11000000
  • 匹配身份证:\d{18}|\d{15} 18位或者15位身份证号码
  • 匹配数字:^[1-9]\d*$ 匹配正整数 ^-[1-9]\d*$ 匹配负整数 ^-?[1-9]\d*$ 匹配整数`
  • 匹配特定字符串:^[a-z]+$ 匹配26个小写字母的字符串 ^\w+$匹配由数字、26个字母、下划线组成的字符串。
  • -

正则表达式Re模块

1.1 简介:
正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同;但不用担心,不被支持的语法通常是不常用的部分。如果已经在其他语言里使用过正则表达式,只需要简单看一看就可以上手了。

下图展示了使用正则表达式进行匹配的流程:
这里写图片描述

1.2. 数量词的贪婪模式与非贪婪模式
正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式”ab*“如果用于查找”abbbc”,将找到”abbb”。而如果使用非贪婪的数量词”ab*?”,将找到”a”**。

1.3. 反斜杠的困扰
与大多数编程语言相同,正则表达式里使用”\”作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符”\”,那么使用编程语言表示的正则表达式里将需要4个反斜杠”\\”:前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r”\”表示。同样,匹配一个数字的”\d”可以写成r”\d”。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。

1.4. 匹配模式
正则表达式提供了一些可用的匹配模式,比如忽略大小写、多行匹配等,这部分内容将在Pattern类的工厂方法re.compile(pattern[, flags])中一起介绍。

2. re模块
2.1. 开始使用re
Python通过re模块提供对正则表达式的支持。使用re的一般步骤是先将正则表达式的字符串形式编译为Pattern实例,然后使用Pattern实例处理文本并获得匹配结果(一个Match实例),最后使用Match实例获得信息,进行其他的操作。

# encoding: UTF-8
import re

# 将正则表达式编译成Pattern对象
pattern = re.compile(r'hello')

# 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
match = pattern.match('hello world!')

if match:
    # 使用Match获得分组信息
    print match.group()

### 输出 ###
# hello
你真的想匹配"allen@hit.edu.cn"这个邮箱(我的邮箱)

import re

key = r"afiouwehrfuiallen@hit.edu.cnaskdjhfiosueh"
p1 = r"allen@hit\.edu\.cn"
pattern1 = re.compile(p1)
print pattern1.findall(key)

发现了吧,我们在.的前面加上了转义符\,但是并不是代表匹配“.”的意思,而是只匹配“.”的意思!
2.2 生成正则表达式对象, 字符匹配和搜索
re模块提供了许多用于字符串处理的函数,这些函数由两种格式:一种是直接使用re模块的格式;另一种是正则表达式对象的格式。两种的函数参数不一样的。正则表达式的对象的函数功能更为强大,也更为常用的方法。
示例1:可能既有http://开头的,又有https://开头的,我们怎么处理?

import re

key = r"http://www.nsfbuhwe.com and https://www.auhfisna.com"#胡编乱造的网址,别在意
p1 = r"https*://"#看那个星号!s字符 0个或者多个字符。
pattern1 = re.compile(p1)
print pattern1.findall(key)

输出

['http://', 'https://']

还是举个栗子,我们发现啊,有的程序员比较过分,,在这对标签上,大小写混用,老害得我们抓不到想要的东西,我们该怎么应对?

import re

key = r"lalala<hTml>hello</Html>heiheihei"
p1 = r"<[Hh][Tt][Mm][Ll]>.+?</[Hh][Tt][Mm][Ll]>"
pattern1 = re.compile(p1)
print pattern1.findall(key)
输出

['<hTml>hello</Html>']

2.2 实战中的案例
我们可能已经掌握了大致的正则表达式的构造方式,但是我们常常会在实战中遇到一些匹配的不准确的问题。比方说:

import re

这里写代码片


key = r"chuxiuhong@hit.edu.cn"
p1 = r"@.+\."#我想匹配到@后面一直到“.”之间的,在这里是hit
pattern1 = re.compile(p1)
print pattern1.findall(key)

输出结果

['@hit.edu.']

呦呵!你咋能多了呢?我理想的结果是@hit.,你咋还给我加量了呢?这是因为正则表达式默认是“贪婪”的,我们之前讲过,“+”代表是字符重复一次或多次。但是我们没有细说这个多次到底是多少次。所以它会尽可能“贪婪”地多给我们匹配字符,在这个例子里也就是匹配到最后一个“.”。
我们怎么解决这种问题呢?只要在“+”后面加一个“?”就好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值