Python中的正则表达式
本文主要介绍一些Python的正则表达式,像图形数据库、正则表达式等作为知识图谱构建的基础,还是有必要知道一下的,这几篇博客都属于为以后打基础。关注专栏《知识图谱系列》了解更多关于知识图谱的内容~
目录
一、简介
Python自1.5版本起增加了re模块,它提供 Perl风格的正则表达式模式。正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。re模块使Python语言拥有全部的正则表达式功能。compile函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。re模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。接下来,我们来具体看一下这些函数。
二、re.match函数
2.1 函数介绍
re.match函数尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none;如果匹配成功,就返回一个匹配的对象。其语法格式如下:
re.match(pattern, string, flags=0)
相关参数说明如下:
我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
2.2 示例
import re
if __name__ == '__main__':
test_data = "This is a test data: My name is xzw."
match_object = re.match(r'(.*) is (.*?) .*', test_data, re.M | re.I)
if match_object:
print("match_object.groups() : ", match_object.groups())
print("match_object.group() : ", match_object.group())
print("match_object.group(1) : ", match_object.group(1))
print("match_object.group(2) : ", match_object.group(2))
else:
print("No match!!")
输出这个结果,我们可以看到如下内容:
三、re.search函数
3.1 函数介绍
re.search函数会在字符串内查找模式匹配,直到找到第一个匹配。其语法为:
re.search(pattern, string, flags=0)
函数参数说明如下:
同样的,匹配成功re.search方法返回一个匹配的对象,否则返回None。
3.2 示例
import re
if __name__ == '__main__':
test_data = "This is a test data: My name is xzw."
match_object = re.search( r'(.*) name (.*?) .*', test_data, re.M|re.I)
if match_object:
print("match_object.groups() : ", match_object.groups())
print("match_object.group() : ", match_object.group())
print("match_object.group(1) : ", match_object.group(1))
print("match_object.group(2) : ", match_object.group(2))
else:
print("No match!!")
函数运行结果如下:
注意:re.match函数只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search函数匹配整个字符串,直到找到一个匹配。
下面来看一个例子,用来区分两者的区别。
import re
if __name__ == '__main__':
test_data = "This is a test data: My name is xzw."
search_object = re.search(r'name', test_data, re.M | re.I)
if search_object:
print("search_object.group() : ", search_object.group())
else:
print("No search!!")
match_object = re.match(r'name', test_data, re.M | re.I)
if match_object:
print("match_object.group() : ", match_object.group())
else:
print("No match!!")
输出结果如下:
四、检索和替换
4.1 函数介绍
re.sub函数用于替换字符串中的匹配项。其语法如下:
re.sub(pattern, repl, string, max=0)
其中,repl参数可以是一个函数。
4.2 repl参数是非函数的示例
import re
if __name__ == '__main__':
phone = "187-1111-1111 # 这是一个移动的电话号码"
# 删除字符串中的注释内容
number = re.sub(r'#.*$', "", phone)
print("phone: ", number)
# 删除非数字(-)的字符串
number = re.sub(r'\D', "", phone)
print("phone: ", number)
运行结果为:
4.3 repl参数是函数的示例
import re
def multiply(match_num):
'''
将匹配到的数字乘以2
:param match_num: 匹配到的数字
:return: 返回处理后的结果
'''
value = int(match_num.group('value'))
return str(value * 2)
if __name__ == '__main__':
s = '12354HFD567'
print(re.sub('(?P<value>\d+)', multiply, s))
运行结果如下所示:
五、re.compile函数
5.1 函数介绍
compile函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。其语法为:
re.compile(pattern[, flags])
参数解释如下:
(1)pattern: 一个字符串形式的正则表达式
(2)flags: 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
re.I 忽略大小写
re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
re.M 多行模式
re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于Unicode字符属性数据库
re.X 为了增加可读性,忽略空格和 # 后面的注释
5.2 示例
import re
if __name__ == '__main__':
pattern = re.compile(r'\d+') # 用于匹配至少一个数字
m1 = pattern.match('aaa123bbb456ccc789') # 查找头部,没有匹配
print(m1)
m2 = pattern.match('aaa123bbb456ccc789', 2, 10) # 从'a'的位置开始匹配,没有匹配
print(m2)
m3 = pattern.match('aaa123bbb456ccc789', 3, 10) # 从'1'的位置开始匹配,正好匹配
print(m3)
print(m3.group(), m3.start(), m3.end(), m3.span())
运行结果如下所示:
在上面的示例中,当匹配成功时返回一个Match对象,其中:group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0);start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;span([group])方法返回 (start(group), end(group))。
六、findall函数
6.1 函数介绍
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。其语法为:
findall(string[, pos[, endpos]])
参数说明如下:
1、string: 待匹配的字符串。
2、pos: 可选参数,指定字符串的起始位置,默认为0。
3、endpos: 可选参数,指定字符串的结束位置,默认为字符串的长度。
6.2 示例
import re
if __name__ == '__main__':
pattern = re.compile(r'\d+') # 查找数字
result1 = pattern.findall('This is a test data: My name is xzw.')
result2 = pattern.findall('dhfsa3bn45tdfs', 0, 10)
print(result1)
print(result2)
运行结果如下:
七、re.finditer函数
7.1 函数介绍
和findall函数类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。其语法为:
re.finditer(pattern, string, flags=0)
7.2 示例
import re
if __name__ == '__main__':
iter = re.finditer(r"\d+", "vfdkl4teree87693n2342ln")
for match in iter:
print(match.group())
运行结果如下:
八、re.split函数
8.1 函数介绍
split 方法按照能够匹配的子串将字符串分割后返回列表,其语法如下:
re.split(pattern, string[, maxsplit=0, flags=0])
其参数说明如下:
九、其他
9.1 正则表达式修饰符-可选标志
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。
9.2 正则表达式模式
模式字符串使用特殊的语法来表示一个正则表达式:字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。多数字母和数字前加一个反斜杠时会拥有不同的含义。标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。反斜杠本身需要使用反斜杠转义。由于正则表达式通常都包含反斜杠,所以最好使用原始字符串来表示它们。模式元素(如 r'/t',等价于'//t')匹配相应的特殊字符。下表图列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。
本文到此已经接近尾声了,本文主要讲述了Python的正则表达式。其中参考了W3CSchool的教程。你们在此过程中遇到了什么问题,欢迎留言,让我看看你们都遇到了什么问题~
本文地址:https://blog.csdn.net/gdkyxy2013/article/details/109618809