‘壹’ python正则表达式(二)
上节我们说到 Python 正则表达式的基本字符,以及这些字符的用法
今天,我们继续讲讲 Python 中一些扩展标记法,以及一些特殊序列
(?...) : 这种扩展标记法以括号内 ? 开头,其后第一个字符决定了采用什么样的语法。
在 ? 后面添加( 'a', 'i', 'L', 'm', 's', 'u', 'x' 中的一个或多个),然后加上匹配规则。
这些字符对正则表达式设置以下标记,免去设置 flag 参数
注意 : 'a', 'L', 'u' 作为内联标记是相互排斥的,它们不能结合在一起
括号分组的非捕获版本,该分组所匹配的子字符串 不能 在执行匹配后被获取或是在之后的模式中被引用
可以配合 | 和 {m} 使用
为分组再指定一个组合名
每个组合名只能用一个正则表达式定义,只能定义一次
反向引用一个命名组合
匹配前面那个名字叫 name 的命名组中匹配到的字符串
注释信息,里面的内容会被忽略。
哈哈,是不是没看懂,没事,举个栗子
看看,是不是一下子就明了了。
哈哈,这个又看不懂?
思考一下,既然有根据后面字符断言的,那么根据前面字符来断言,也是很合理的,
如果给定的 id 或 name 存在,将会尝试匹配 yes-pattern ,否则就尝试匹配 no-pattern , no-pattern 可选,也可以被忽略。
是不是有点像 if else 三目运算,其中 id 和 name 是分组 id 、和指定的分组名 name
照旧,举个栗子吧
看了栗子是不是有点糊涂呢,我们来解析一下这个正则表达式
其结果匹配的就是 <[email protected]> 和 [email protected] 。
而不会匹配 <[email protected] ' 和 <[email protected]
但是上面的第三个结果为啥不一样呢?
因为 findall 允许返回空匹配的,在有 ? 的情况下,所以它会分两种情况去匹配
今天讲了一些扩展标记法,其实没那么难,多看看例子,多练习练习。
下节将介绍 re 模块各函数的用法,敬请期待......
‘贰’ python 正则表达式怎么匹配
Python本不等于正则语言,它只是内部集成了一个正则引擎,这个引擎实现了正则语言的功能,在Python中,这个引擎就是re模块。所以,你要先‘import re’。
下面网页详细介绍了正则本身和re模块,可供参考,基本上覆盖了所有内容。
‘叁’ 如何编写python的正则表达式
Python re正则匹配伏弯戚枝中文,其实非常简单,把中文的unicode字符串转换成utf-8格式就可以了,然后可以在re中随意调用
unicode中中文的编码为/u4e00-/u9fa5,因此正则表达式u”[\u4e00-\u9fa5]+”可以表示一个或者多个中文字符
>>> import re
>>> s='中文:123456aa哈哈哈bbcc'.decode('utf8')
>>> s
u'\u4e2d\u6587\uff1a123456aa\u54c8\u54c8\u54c8bbcc'
>>> print s
中文:123456aa哈哈哈bbcc
>>> re.match(u"[\u4e00-\u9fa5]+",s)
<_sre.SRE_Match object at 0xb77742c0>
>>> pat='中文'缺仔闷.decode("utf8")
>>> re.search(pat,s)
<_sre.SRE_Match object at 0x16a16df0>
>>> newpat='这里是中文内容'.decode("utf8")
>>> news=re.sub(pat,newpat,s)
>>> print news
这里是中文内容:123456aa哈哈哈bbcc
‘肆’ python帮忙写个处理网页的正则表达式,如下
a='''<input type="hidden" name="lt" value="LT-111224-"/>
<input type="hidden"睁前兄 name="悉袭execution" value="e2s1"悔消/>
<input type="hidden" name="_eventId" value="submit"/>
<input class="btn btn-submit" name="submit" accesskey="l" value="登录" tabindex="4" type="submit"/>
<input class="btn btn-submit" name="reset" accesskey="c" value="重置" tabindex="5" type="reset"/>
<br><br>'''
import re
b=re.findall('<input .*? name=\"(.*?)\".*? value=\"(.*?)\"',a)
print dict(b)
‘伍’ 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, s, S 依赖于当前环境。
re.M:多行模式。
re.S:即 . ,并且包括换行符在内的任意字符(. 不包括换行符)。
re.U:表示特殊字符集 w, W, , 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常用的正则表达式处理函数详解的文章就介绍到这了,希望大家以后多多支持!
‘陆’ python中提取网页特定内容4的正则表达式如何写
python有个进门解析html的包BeautifulSoup,用它要比用正则方便很多
‘柒’ python正则表达式是什么
python正则表达式是使用单个字符串来描述、匹配某个句法规则的字符串,常被用来检索、替换那些符合某个模式(规则)的文本。最初的正则表达式出现于理论计算机科学的自动控制理论和形式化语言理论中。
1950 年,数学家斯蒂芬·科尔·克莱尼利用称之为“正则集合”的数学符号来描述此模型。肯·汤普逊将此符号系统引入编辑器 QED,随后是 UNIX 上的编辑器 ed,并最终引入 grep。自此以后,正则表达式被广泛地应用于各种 UNIX 或类 UNIX 系统的工具中。目前,许多程序设计语言都支持利用正则表达式进行字符串操作。
正则表达式常用的特殊字符:
:将下一个字符标记为一个特殊字符、一个原义字符(Identity Escape,有 "^" "$" "(" ")" "*" "+" "{" "|" 共计12个)、一个向后引用(backreferences)或一个八进制转义符。例如“n”匹配字符“n”,“ ”匹配一个换行符,“\”匹配“”,“(”则匹配“(”。
^:匹配输入字符串的开始位置。如果设置了正则表达式的多行属性,“^”也可以匹配“ ”或“ ”之 后的位置。
[a-z]:字符范围,匹配指定范围内的任意字符。例如“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。
s:匹配任何空白字符,包括空格、制表符、换页符等,等效于“[f v]”。注意 Unicode 正则表达式 会匹配全角空格符。
‘捌’ python正则表达式,如何选取网页中一部分字符
‘玖’ python正则表达式是什么呢
python正则表达式如下:
在python中,所谓的“正则表达式”指的是通常被用来检索、替换那些符合某个模式的一段文本。具体而言,它的作用是检测某个字符串是否符合规则和提取网页字符串中想要的数据。
正则表达式是对字符串提取的一套规则,我们把这个规则用正则里面的特定语法表达出来,去匹配满足这个规则的字符串。正则表达式具有通用型,不仅python里面可以用,其他的语言也一样适用。
python的编程特点:
速度快:Python的底层是用C语言写的,很多标准库和第三方库也都是用C写的,运行速度非常快。
免费、开源:Python是FLOSS(自由/开放源码软件)之一。使用者可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS是基于一个团体分享知识的概念。
高层语言:用Python语言编写程序的时候无需考虑诸如如何管理你的程序使用的内存一类的底层细节。
解释性:一个用编译性语言比如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。
‘拾’ Python中的正则表达式
因为正则表达式中有两组小括号,即两个分组
findall会以元组乱销形式返回所有分组中的内容,即[('127.0.0.1', '.1')]
其中'127.0.01'表示匹配最外层大括号的内容
'.1'表示匹配'.[0-9]{1,3}'的内容(最后一次重复时为.1)
由于('.[0-9]{1,3}')为需要重复三次的分组,该括号不能省略
而使用findall就一定会显示括号分组的内容
若想只显示127.0.0.1而不哗梁游显示'.1',可考虑使用match方法
返回从字符串起始位置开始,第一次匹配正则表达式的内容
match返回的结果为re.Match对象,可通过group()显示匹配的字符串,渣袭即127.0.0.1
通过groups()显示匹配的所有分组,即('127.0.0.1', '.1')
如图所示: