正则表达式的定义
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本正则表达式的作用和特点
1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。
正则表达式的特点是:
1. 灵活性、逻辑性和功能性非常强;
2. 可以迅速地用极简单的方式达到字符串的复杂控制。
3. 对于刚接触的人来说,比较晦涩难懂。
表示数量
原始字符串
原始字符串:所有的字符串都是直接按照字面的意思来使用,没有转义特殊的意义或不能打印的字符。 在字符串前加个 “r” 反斜杠就不会被任何特殊方式处理,所以 r”\n” 就是包含”\” 和 “n” 的两个字符,而 “\n” 则是一个字符,表示一个换行。正则表达式通常在 Python 代码中都是用这种 raw 字符串表示。与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。
表示边界
匹配分组
( )提取字符串中的某一部分的时候用到分组提取时()中的内容是group(1)从左到右从1开始。整体作为0组。groups()元组形式保存各个分组的内容。
re模块操作import re 使用compile 函数后的方法
1)使用 compile() 函数将正则表达式的字符串形式编译为一个 Pattern 对象2)通过 Pattern 对象提供的一系列方法对文本进行匹配查找,获得匹配结果,一个 Match 对象。3)最后使用 Match 对象提供的属性和方法获得信息,根据需要进行其他的操作
import re
content = "hello world python and python atguigu!"
#正则表达式:r"world"
#内容:"hello world python and python atguigu!"
pattern = re.compile(r"python")
#从6位置开始匹配到末尾,匹配成功一个后返回
ret = pattern.match(content,12,len(content))
print(ret)
print(ret.group())
• match 方法:从起始位置开始查找,也可以设置从某个位置开始匹配,一次匹配
• search 方法:从任何位置开始查找,也可以设置从某个位置开始匹配,一次匹配
• findall 方法:全部匹配,也可以设置从某个位置开始匹配,返回列表
• finditer 方法:全部匹配,也可以设置从某个位置开始匹配,返回迭代器
• split 方法:分割字符串,返回列表
• sub 方法:替换,替换多少个字符串。
2. findall得到所有匹配的数据就用findall。结果返回的是一个列表包含所有符合正则表达式的数据
3. sub 将匹配到的数据进行替换可以使用函数
s=http://www.interoem.com/messageinfo.asp?id=35(保存网址)
re.sub(r"(http://.+?/)(.+)",lambda x:x.group(1),s)
4. split 根据匹配进行切割字符串,并返回一个列表
ret = re.split(r":|,|\s+","info:xiaoZhang,33 shandong") \s+多个空格
5. match方法进行匹配操作
result = re.match(pattern=正则表达式, 要匹配的字符串) pattern可以不写
# 如果上一步匹配到数据的话,可以使用group方法来提取数据 result.group()
1)re.match() 能够匹配出以xxx开头的字符串
2)而且匹配过程中是从左到右的过程。
e.match是用来进行正则匹配检查的方法,若字符串匹配正则表达式,则match方法返回匹配对象(Match Object),否则返回None(注意不是空字符串"")。
'''字符串'''三个引号括起来用来保持字符串的原有格式
6.finditer 方法的行为跟 findall 的行为类似,也是搜索整个字符串,获得所有匹配的结果。但它返回一个顺序访问每一个匹配结果(Match 对象)的迭代器。
pattern = re.compile(r'\d+')
#返回的是迭代器
result_iter1 = pattern.finditer('hello 123456 789')
for m1 in result_iter1: # m1 是 Match 对象
print('matching string: {}, position: {}'.format(m1.group(), m1.span()))
m1.span()显示的时刷选出字符串的位置
python贪婪和非贪婪
Python里正则表达式默认是开启贪婪模式的,总是尝试匹配尽可能多的字符;非贪婪则相反,总是尝试匹配尽可能少的字符。在"*","?","+","{m,n}"后面加上?(在量词后面添加),使贪婪变成非贪婪。import re 先获得正则在进行匹配
com = re.compile('\d+')
if com.match(username):
中文提取出来
title = u'你好,hello,世界,我很love这个世界'
pattern = re.compile(r'[\u4e00-\u9fa5]+')
result = pattern.findall(title)
re.I:忽略大小写
re.S:全文匹配
如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始,不会跨行。而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,将“\n”当做一个普通的字符加入到这个字符串中,在整体中进行匹配start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;
end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;
span([group]) 方法返回 (start(group), end(group))。