正则表达式是很强大的用来处理字符串的工具。
引用模块
import re
模块里面几个重要的函数
1.re.compile(pattern, flags)
第一个参数是正则表达式,第二个参数是表示匹配模式,比如re.I(I是IGNORECASE的缩写也就是忽略大小写)
将正则表达式编译成Pattern对象,主要供search和match这两个函数使用。
这函数
pattern = re.compile(r'hello')
print(type(pattern))
#输出如下
>>> <class '_sre.SRE_Pattern'>
2.re.match(pattern, str, flags)
第一个参数是匹配模式 第二个是字符串,第三个是模式,默认为0
这个函数是从所给的字符串里从第一个字符开始寻找一个匹配的字符串,如果第一个字符就匹配不上的话就算匹配不到。
str1 = 'hello world'
str2 = 'hahahello world'
pattern = re.compile(r'hello')
res1 = re.match(pattern, str1)
res2 = re.match(pattern, str2)
print(res1)
print(res1.group())
print(res2)
print(res2.group())
#输出如下
>>> <_sre.SRE_Match object; span=(0, 5), match='hello'>
>>> hello
>>> None
#最后一个报错,因为 'NoneType' object has no attribute 'group'
3.re.search(pattern, string, flags)
search与match的区别就在于match一定要从字符串第一个字符开始匹配,但search不用,也就是search是查找任意位置匹配的字符串。
4.re.findall(pattern, string, flags)
findall是以列表形式返回所有可以匹配的字符串,从string的任意位置开始匹配,并返回一个匹配列表。
5.re.finditer(pattern, string, flags)
finditer作用和findall一样,只是findall返回一个列表,而finditer返回一个迭代器。
pattern = re.compile('\w+')
s = "aszhu....hxew8639721jak3;[]"
a = pattern.findall(s)
b = pattern.finditer(s)
print(a)
print(b)
#输出如下
>>> ['aszhu', 'hxew8639721jak3']
>>> <callable_iterator object at 0x000001CB14EDA5C0>
6.re.split(pattern, string, maxsplit, flags)
用pattern分开字符串,maxsplit表示最多分割次数。
pattern = re.compile(',')
s = "我的天,哈哈哈哈哈,笑死了,*_*"
z = pattern.split(s)
print(z)
#输出如下
>>> ['我的天', '哈哈哈哈哈', '笑死了', '*_*']
7.re.sub(pattern, repl, string, count, flags)
这是替换函数,将在string中匹配到的用repl进行替换,count代表最大替换次数,flags表示模式。
pattern = re.compile('[a-z]+')
s = "我的天,hahahaha,笑死了,*_*"
z = pattern.sub("嘻嘻",s)
print(z)
#输出如下
>>> 我的天,嘻嘻,笑死了,*_*
模块里面的分组用法
group()
不加参数默认返回所有匹配的对象。
当括号里加入数字参数的时候,就返回当前参数所在位置的对象。
【顺便start / end / span 的用法一起提了】
pattern = re.compile('([^,]+),([^,]+),([^,]+),([^,]+)')
s = "我的天,哈哈哈哈哈,笑死了,*_*"
z = pattern.search(s)
#返回整个匹配的字符串
print("group:" + z.group())
#返回第二个匹配的元组
print("group2:" + str(z.group(2)))
#返回第三个到第四个匹配的元组
print("group3-4:" + str(z.group(3, 4)))
#返回匹配字符串的起始位置
print("start:" + str(z.start()))
#返回匹配字符串的结束位置
print("end:" + str(z.end()))
#返回匹配字符串的范围
print("span:" + str(z.span()))
#输出如下
>>> group:我的天,哈哈哈哈哈,笑死了
>>> group2:哈哈哈哈哈
>>> group3-4:('笑死了', '*_*')
>>> start:0
>>> end:17
>>> span:(0, 17)
group()除了能加数字的参数之外,还能加字符串的参数即利用别名访问分组。
前提是得用到使用了(?P<name>)的语法。
str = 'MAYDAY is everyday'
x = re.compile("(?P<name>\w+)\s\w+\s(\w+)")
print(x.search(str).group('name'))
#输出如下
>>> MAYDAY
模块里一些常用的匹配模式
1. IGNORECASE
简写为re.I => 忽视大小写
2. ASCII
简写为re.A => 让 \w, \W, \b, \B, \d, \D, \s 和 \S 只匹配ASCII,而不是Unicode。
3. DOTALL
简写为re.S => dot表示. all表示所有即.匹配所有包括换行符\n,默认情况下,.是不匹配换行符的。
4. MULTILINE
简写为 re.M => 多行模式,当某字符串中有换行符\n,默认模式下是不支持换行符特性的,比如:行开头 和 行结尾,而多行模式下是支持匹配行开头的。
5. VERBOSE
简写为 re.X => 详细模式,可以在正则表达式中加注解。
正则表达式的一些语法


1483

被折叠的 条评论
为什么被折叠?



