正则表达式详解(正则表达式∧含义)

http://www.itjxue.com  2023-03-03 21:41  来源:未知  点击次数: 

正则表达式?

简答:把原先的

^(.*?)=

的最后的 等于号= 变成

(?=xxx): (positive) look ahead (assertion)=正向肯定断言

即可。

详解:

完整的正则是:

^(.*?)(?==)

即可,只匹配到

key1

具体解释:

(?=xxx)

表示,匹配(后面的字符串符合) xxx的情况,但是不包含在匹配的结果中

所以此处就是,匹配

key1=

中的 =,但结果中不包含 =

就变成你要的:结果中只包含 key1 了。

对应python的演示代码:

? python

Python 3.8.0 (default, Jan ?6 2020, 10:33:50)

[Clang 10.0.1 (clang-1001.0.46.4)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

import re

inputStr = "key1=abckey2=bcdkey3=efg"

foundKey1 = re.search("^(.*?)(?==)", inputStr)

print(foundKey1)

re.Match object; span=(0, 4), match='key1'

key1Str = foundKey1.group(1)

print(key1Str)

key1

引申:

正向肯定断言 属于?环视断言

具体详见我的教程:

环视断言 · 应用广泛的超强搜索:正则表达式

^([1-9]{0,1}[0-9]{0,4})$ 这个正则表达式表示什么意思?

匹配0~99999的数字,包括类似001这样的数字。

其中:

^:匹配输入字行首

[a-z]:字符范围,匹配指定范围内的任意字符。

{n,m}:m和n均为非负整数,其中n=m,最少匹配n次且最多匹配m次。

$ :匹配输入行尾

故:

^([1-9]{0,1}[0-9]{0,4})$ :表示1到9的数字,出现0次或1次;1到9的数字,出现0次或4次。简单来说就是0~99999的数字。

扩展资料:

正则表达式的特点是:

1. 灵活性、逻辑性和功能性非常强;

2. 可以迅速地用极简单的方式达到字符串的复杂控制。

3. 对于刚接触的人来说,比较晦涩难懂。

由于正则表达式主要应用对象是文本,因此它在各种文本编辑器场合都有应用,小到著名编辑器EditPlus,大到Microsoft Word、Visual Studio等大型编辑器,都可以使用正则表达式来处理文本内容。

参考资料:百度百科-正则表达式

求正则表达式详解 谢谢 就这么点分了

独立表达式(?pattern) 不管后面的是否匹配成功,独立表达式内部不进行回退。

(?R) 引用整个表达式。

分析下\(((?[^()]+)|(?R))*\)的匹配过程,由于存在递归,初始的正则式称为正则式一,第一次递归称为正则式二…

首先,字符串前面的C11:匹配不到,然后\(匹配到(,(?[^()]+)匹配到C111:接下来的(匹配失败,执行多选分支后一项(?R)且不回退,于是从C111:的:后面的位置开始调用正则式二。

正则式二中\(匹配到(,(?[^()]+)匹配到C1111:A1111,\)匹配到),正则式二匹配结束,继续回到正则式一,式子执行到了* 前面括号内容重复一次 (?[^()]+)匹配到;C112;A112,\)匹配到),整个正则表达式匹配完成。

本例中,只用到一次递归,展开后就相当于

\((?[^()]+)\((?[^()]+)\)(?[^()]+)\)

Python常用的正则表达式处理函数详解

正则表达式是一个特殊的字符序列,用于简洁表达一组字符串特征,检查一个字符串是否与某种模式匹配,使用起来十分方便。

在Python中,我们通过调用re库来使用re模块:

import re

下面介绍Python常用的正则表达式处理函数。

re.match函数

re.match 函数从字符串的起始位置匹配正则表达式,返回match对象,如果不是起始位置匹配成功的话,match()就返回None。

re.match(pattern, string, flags=0)

pattern:匹配的正则表达式。

string:待匹配的字符串。

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:为了增加可读性,忽略空格和 # 后面的注释。

import?re #从起始位置匹配 r1=re.match('abc','abcdefghi') print(r1) #不从起始位置匹配 r2=re.match('def','abcdefghi') print(r2)

运行结果:

其中,span表示匹配成功的整个子串的索引。

使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

group(num):匹配的整个表达式的字符串,group() 可以一次输入多个组号,这时它将返回一个包含那些组所对应值的元组。

groups():返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

import?re s='This?is?a?demo' r1=re.match(r'(.*)?is?(.*)',s) r2=re.match(r'(.*)?is?(.*?)',s) print(r1.group()) print(r1.group(1)) print(r1.group(2)) print(r1.groups()) print() print(r2.group()) print(r2.group(1)) print(r2.group(2)) print(r2.groups())

运行结果:

上述代码中的(.*)和(.*?)表示正则表达式的贪婪匹配与非贪婪匹配。

re.search函数

re.search函数扫描整个字符串并返回第一个成功的匹配,如果匹配成功则返回match对象,否则返回None。

re.search(pattern, string, flags=0)

pattern:匹配的正则表达式。

string:待匹配的字符串。

flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

import?re #从起始位置匹配 r1=re.search('abc','abcdefghi') print(r1) #不从起始位置匹配 r2=re.search('def','abcdefghi') print(r2)

运行结果:

使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

group(num=0):匹配的整个表达式的字符串,group() 可以一次输入多个组号,这时它将返回一个包含那些组所对应值的元组。

groups():返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

import?re s='This?is?a?demo' r1=re.search(r'(.*)?is?(.*)',s) r2=re.search(r'(.*)?is?(.*?)',s) print(r1.group()) print(r1.group(1)) print(r1.group(2)) print(r1.groups()) print() print(r2.group()) print(r2.group(1)) print(r2.group(2)) print(r2.groups())

运行结果:

从上面不难发现re.match与re.search的区别:re.match只匹配字符串的起始位置,只要起始位置不符合正则表达式就匹配失败,而re.search是匹配整个字符串,直到找到一个匹配为止。

re.compile 函数

compile 函数用于编译正则表达式,生成一个正则表达式对象,供 match() 和 search() 这两个函数使用。

re.compile(pattern[, flags])

pattern:一个字符串形式的正则表达式。

flags:可选,表示匹配模式,比如忽略大小写,多行模式等。

import?re #匹配数字 r=re.compile(r'\d+')? r1=r.match('This?is?a?demo') r2=r.match('This?is?111?and?That?is?222',0,27) r3=r.match('This?is?111?and?That?is?222',8,27) ? print(r1) print(r2) print(r3)

运行结果:

findall函数

搜索字符串,以列表形式返回正则表达式匹配的所有子串,如果没有找到匹配的,则返回空列表。

需要注意的是,match 和 search 是匹配一次,而findall 匹配所有。

findall(string[, pos[, endpos]])

string:待匹配的字符串。

pos:可选参数,指定字符串的起始位置,默认为0。

endpos:可选参数,指定字符串的结束位置,默认为字符串的长度。

import?re #匹配数字 r=re.compile(r'\d+')? r1=r.findall('This?is?a?demo') r2=r.findall('This?is?111?and?That?is?222',0,11) r3=r.findall('This?is?111?and?That?is?222',0,27) ? print(r1) print(r2) print(r3)

运行结果:

re.finditer函数

和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

re.finditer(pattern, string, flags=0)

pattern:匹配的正则表达式。

string:待匹配的字符串。

flags:标志位,用于控制正则表达式的匹配方式,如是否区分大小写,多行匹配等。

import?re? r=re.finditer(r'\d+','This?is?111?and?That?is?222') for?i?in?r:? ?print?(i.group())

运行结果:

re.split函数

将一个字符串按照正则表达式匹配的子串进行分割后,以列表形式返回。

re.split(pattern, string[, maxsplit=0, flags=0])

pattern:匹配的正则表达式。

string:待匹配的字符串。

maxsplit:分割次数,maxsplit=1分割一次,默认为0,不限次数。

flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等。

import?re? r1=re.split('\W+','This?is?111?and?That?is?222')? r2=re.split('\W+','This?is?111?and?That?is?222',maxsplit=1)? r3=re.split('\d+','This?is?111?and?That?is?222')? r4=re.split('\d+','This?is?111?and?That?is?222',maxsplit=1)? print(r1) print(r2) print(r3) print(r4)

运行结果:

re.sub函数

re.sub函数用于替换字符串中的匹配项。

re.sub(pattern, repl, string, count=0, flags=0)

pattern:正则中的模式字符串。

repl:替换的字符串,也可为一个函数。

string:要被查找替换的原始字符串。

count:模式匹配后替换的最大次数,默认0表示替换所有的匹配。

import?re? r='This?is?111?and?That?is?222' #?删除字符串中的数字 r1=re.sub(r'\d+','',r) print(r1) #?删除非数字的字符串? r2=re.sub(r'\D','',r) print(r2)

运行结果:

到此这篇关于Python常用的正则表达式处理函数详解的文章就介绍到这了,希望大家以后多多支持!

(责任编辑:IT教学网)

更多