百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

正则表达式不是一天能学会的!这是我花七天整理的!希望能帮到你

toyiye 2024-06-21 12:37 10 浏览 0 评论

一.正则表达式概念

1.定义

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

2.表达式列表

私信菜鸟007有更多的教程!

3.(?iLmsux)为分组设置模式

这里的”i”, “L”, “m”, “s”, “u”, “x”,它们不匹配任何字串,而是表示对应python中re模块当中的(re.I, re.L, re.M, re.S, re.U, re.X)的6种选项。

可以在python源码中看到:

I = IGNORECASE # 忽略大小写
L = LOCALE # 字符集本地化,为了支持多语言版本的字符集使用环境
U = UNICODE # 使用\w,\W,\b,\B这些元字符时将按照UNICODE定义的属性
M = MULTILINE # 多行模式,改变 ^ 和 $ 的行为
S = DOTALL # '.' 的匹配不受限制,包括换行符
X = VERBOSE # 冗余模式,可以忽略正则表达式中的空白和#号的注释

六种模式在正则表达式中可以同时使用多个的,在 python 里面使用按位或运算符 | 同时添加多个模式如:re.compile(”, re.I|re.M|re.S)

4.反斜杠的使用

在一般的编程语言当中,反斜杠“\”代表反转义字符,在反斜杠后面加一个字符可以表示一种特定的意思,接下来列举几个常见的转义字符.

因为在正则表达式的规则当中,‘\’就是转义字符的意思,前面基本语法规则里也有说到,但是在一般的变成语言中,’\’也有转义字符的意思,所以,如果我们要是写代码的时候用到正则表达式中的’\’的时候,就需要写四个’\’,才可以代表一个真正的反斜杠字符,如:“\\\\”。“\\\\”:这里的第一个和第三个是在编程语言中起转义的作用,果:“\\”,然后在正则表达式中它在进行一次反转义就代表着一个真正的反斜杠字符了。但是在python语言中,我们可以不考虑这个问题。只需要在写好的字符串前面加一个’r’, 告诉编译器这个字符串是个原生字符串,不要转义’\’ 。例如,上个例子中的正则表达式可以使用r”\”表示。因为加上这个’r’,只是告诉python语言不转义这个字符串,但是在正则表达式中还是要符合正则表达式的规则。同样,匹配一个数字的”\d”就可以写成r”\d”。所以,在python中写正则表达式时,要养成一个前面写’r’的习惯。

5.表达式的应用与区别:

(1).^${}的区别

注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,在一个量词后面加?号使其变成惰性匹配

(2)字符集[] [^]

(3)转义符\

在正则表达式中,有很多有特殊意义的是元字符,比如\d和\s等,如果要在正则中匹配正常的"\d"而不是"数字"就需要对"\"进行转义,变成'\\'。在python中,无论是正则表达式,还是待匹配的内容,都是以字符串的形式出现的,在字符串中\也有特殊的含义,本身还需要转义。所以如果匹配一次"\d",字符串中要写成'\\d',那么正则里就要写成"\\\\d",这样就太麻烦了。这个时候我们就用到了r'\d'这个概念,此时的正则是r'\\d'就可以了。

(4)贪婪匹配

(5)非贪婪匹配

*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

(6).*?的用法

. 是任意字符
* 是取 0 至 无限长度
? 是非贪婪模式。
何在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:
.*?x 就是取前面任意长度的字符,直到一个x出现

6.re函数方法总结

7.常用函数举例

(1)贪婪与非贪婪模式举例

import re
example = "<div>test1</div><div>test2</div>"
greedPattern = re.compile("<div>.*</div>")
notGreedPattern = re.compile("<div>.*?</div>")
greedResult = greedPattern.search(example)
notGreedResult = notGreedPattern.search(example)
print("greedResult = %s" % greedResult.group())
print("notGreedResult = %s" % notGreedResult.group())

输出结果:

(2)complie()

#描述
def compile(pattern, flags=0):
 "Compile a regular expression pattern, returning a pattern object."
 # 生成一个正则表达式模式,返回一个Regex对象
 return _compile(pattern, flags)
#参数说明
pattern: 正则表达式
flags: 用于修改正则表达式的匹配方式,就是我们在基本语法规则中说到的(iLmsux)六种模式,默认正常模式

举例:

import re
pattern = re.compile(r"\d")
result = pattern.match("123")
print(result.group())
pattern = re.compile(r"abc d", re.I|re.X)""" I = IGNORECASE # 忽略大小写
 X = VERBOSE # 冗余模式,可以忽略正则表达式中的空白和#号的注释"""
result = pattern.match("AbcD")
print(result.group())

输出:

(3)match()

源码描述:

1. def match(pattern, string, flags=0):
 """Try to apply the pattern at the start of the string, returning a match object, or None if no match was found."""
 # 在字符串的开头匹配pattern,返回Match匹配对象,如果没有不到匹配的对象,返回None。
 return _compile(pattern, flags).match(string)
2. def match(self, string, pos=0, endpos=-1):
 """Matches zero | more characters at the beginning of the string."""
 pass
 # 可以指定匹配的字符串起始位置
#参数说明
# 其他两个参数与compile()当中的意义一致
string: 需要验证的字符串
pos: 设定开始位置,默认0
endpos: 设定结束位置,默认-1

举例:

import re
result = re.match(r"a+\d", "aA123", re.I)
print(result.group())
# 输出结果为aA1 只要pattern匹配完了,则视为成功,并将匹配成功的字符串返回
pattern = re.compile(r"abc d", re.I|re.X)
result = pattern.match("0AbcD5", 1, 5)
print(result.group())
# 输出结果为AbcD 从第1个位置开始,到第5个位置之前的字符串

(4)search()

源码描述:

1. def search(pattern, string, flags=0):
 """Scan through string looking for a match to the pattern, returning a match object, or None if no match was found."""
 # 大致意思与match方法相同,不同的地方在于search时整个字符串任意位置匹配,而match时从特定的位置(pos)开始向后仅匹配一次
 return _compile(pattern, flags).search(string)
2. def search(self, string, pos=0, endpos=-1):
 """Scan through string looking for a match, and return a corresponding match instance. Return None if no position in the string matches."""
 pass
 # 可以指定字符串的子串进行匹配
#参数与match()中的一致

举例:

import re
pattern = re.compile(r"abc d", re.I|re.X)
result = pattern.search("0A2aBcd7")
print(result.group())
# 输出结果为aBcd 在字符串中任意位置只要匹配到就返回结果
pattern = re.compile(r"abc d", re.I|re.X)
matchResult = pattern.match("0AbcD5")
searchResult = pattern.search("0AbcD5")
print(matchResult)
print(searchResult)
# matchResult的结果是None
# searchResult.group()的结果结果为AbcD
# 因为在pattern中第一个位置是a,但是在字符串中第一个位置是0,所以match方法在这里匹配失败

(5)group(),groups()和groupdict()

源码描述:

1.def group(self, *args):
 """Return one or more subgroups of the match."""
 # 返回成功匹配的一个或多个子组
 pass
2.def groups(self, default=None):
 """Return a tuple containing all the subgroups of the match, from 1 up to however many groups are in the pattern."""
 # 以元组的格式返回所有分组匹配到的字符
 pass
3.def groupdict(self, default=None):
 """Return a dictionary containing all the named subgroups of the match,keyed by the subgroup name."""
 # 以字典的格式返回所有分组匹配到的字符
 pass
#参数说明:
group中的*args: 如果参数为一个,就返回一个子串;如果参数有多个,就返回多个子串的元组。如果不传任何参数,和传入0一样,将返回整个匹配子串。
groups中的default: 用于给那些没有匹配到的分组做默认值,它的默认值是None
groupdict中的default: 用于给那些没有匹配到的分组做默认值,它的默认值是None

举例:

import re
pattern = re.compile(r"([\w]+) ([\w]+)")
m = pattern.match("Hello World Hi Python")
print(m.group())
# 输出结果为Hello World 第一个分组成功匹配到Hello第二个成功匹配到World 正则表达式已匹配结束
print(m.group(1))
# 输出结果为Hello 取第一个分组成功匹配到Hello
print(m.group(2))
# 输出结果为World 取第二个分组成功匹配到World
pattern = re.compile(r"([\w]+)\.?([\w]+)?")
m = pattern.match("Hello")
print(m.groups())
# 输出结果为('Hello', None) 第一个元素是一个分组匹配到的Hello,因为第二个分组没有匹配到,所以返回None
print(m.groups("Python"))
# 输出结果为('Hello', 'Python') 因为第二个分组没有匹配到,所以返回在groups中设置的默认值
pattern = re.compile(r"(?P<first_str>\w+) (?P<last_str>\w+)")
m = pattern.match("Hello Python")
print(m.groupdict())
# 输出结果为{'first_str': 'Hello', 'last_str': 'Python'} 默认值的用法与group

(6)findall()

源码描述:

def findall(self, string, pos=0, endpos=-1):
 """Return a list of all non-overlapping matches of pattern in string."""
 # 返回字符串中所有匹配成功的子串的列表,
 #重点:返回的是一个列表,没有group方法
 pass
#参数说明
# 与match方法一致

举例:

import re
pattern = re.compile(r'\d+')
m = pattern.findall('a1b2c33d4')
print(m)
# 输出['1', '2', '33', '4'] 查找出字符串中的所有数字
m = pattern.findall('a1b2c33d4', 1, 6)
print(m)
# 输出['1', '2', '3'] 在"1b2c3"中查找

(7)finditer()

源码描述:

def finditer(self, string, pos=0, endpos=-1):
 """Return an iterator over all non-overlapping matches for the pattern in string. For each match, the iterator returns a match object."""
 # 返回字符串中所有匹配成功的子串的迭代器
 pass
#参数说明
#与match方法一致

举例:

import re
pattern = re.compile(r'\d+')
m = pattern.finditer('a1b2c33d4')
print(m)
# 输出<callable_iterator object at 0x0000021EB0E70940>迭代器
print(next(m).group())
# 依次输出匹配到的结果 1

(8)split()

源码描述:

def split(self, string, maxsplit=0):
 """Split string by the occurrences of pattern."""
 # 返回根据匹配到的的子串将字符串分割后成列表
 pass
#参数说明
#maxsplit: 指定最大分割次数,不指定将全部分割。

举例:

import re
pattern = re.compile(r'\d+')
m = pattern.split('a1b2c3d4e')
print(m)
# 输出['a', 'b', 'c', 'd', 'e'] 根据数字,全部分割
m = pattern.split('a1b2c3d4e', 3)
print(m)
# 输出['a', 'b', 'c', 'd4e'] 只分割三次,后面的不进行分割

9 sub()

源码描述

def sub(self, repl, string, count=0):
 """Return the string obtained by replacing the leftmost non-overlapping occurrences of pattern in string by the replacement repl."""
 # repl替换掉字符串中匹配到的子串,变成新的字符串返回
 pass
#参数说明
repl: 替补内容
string: 原字符串
count: 替换次数,默认全部替换

举例:

import re
pattern = re.compile(r'\s+')
text = "Process finished with exit code 0"
m = pattern.sub('-', text, 3)
print(m)
# 输出结果Process-finished-with-exit code 0 前三个空格被‘-’替换了

10.subn()

源码描述:

def subn(self, repl, string, count=0):
 """Return the tuple (new_string, number_of_subs_made) found by replacing the leftmost non-overlapping occurrences of pattern with the replacement repl."""
 # 返回一个由替换后的结果和替换的次数组成的元组
 pass
#参数说明
与sub()参数含义一致

举例:

import re
pattern = re.compile(r'\s+')
text = "Process finished with exit code 0"
m = pattern.subn('-', text)
print(m)
# 输出结果('Process-finished-with-exit-code-0', 5)

未完待续。。。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码