首页 > 编程知识 正文

pycharm安装正则表达式库re,re正则匹配

时间:2023-05-04 20:44:30 阅读:51207 作者:1177

Python的re模块(Regular Expression正则表达式)提供了各种正则表达式的匹配操作,就像Perl脚本中的正则表达式功能一样。 使用此Python内置的语言工具,虽然无法满足所有复杂的匹配情况,但大多数情况下可以高效地分析复杂字符串和提取相关信息。 Python将正则表达式转换为字节码,并利用c语言匹配引擎进行深度优先匹配。

Python正则表达式语法

正则表达式可以包含普通字符和特殊字符,普通字符(如数字和字符)可以直接与目标字符串匹配。 本节介绍如何使用特殊字符(如“|”和“”)模糊匹配字符串。 使用这些特殊字符,正则表达式可以表示普通字符的类,也可以改变周围正则表达式的含义。 具体而言,如表2-1所示

表1 .正则表达式语法

符号含义示例

水平。

表示任何字符,如果指定了DOTALL标记,则表示包含新行的所有字符。

^

表示字符串的开头。

$

表示字符串的结束。

“test”与“‘testtool”匹配,而“test $”仅与“test”匹配。

*,

“*”表示后面可以跟0个字符以上,“”表示后面可以跟1个字符以上,“? 表示后跟0个以上字符

“ABC *”可以匹配“ABC”、“ABCD”、“‘ABCDEFG”等。

*?

以上结果中只去第一个

一致

整个title '字符串(贪婪匹配),*? 只能找到(非贪婪匹配() m ) ) )。

对上一个字符重复m次

{1}a{2}{3}与6个“a”一致

{m,n}

对前一个字符重复m次到n次

匹配a{2,4 }2- 4个a,匹配a{ 2,}2个以上的a,匹配a {,4}4个以下的a

{m,n}?

对前一个字符重复m次至n次,且尽量少时

在字符串“aaaaaa”中,a { 2,4 }与四个a匹配,a { 2,4 }? a只有两个一致

转义特殊字符或指定特殊序列

[]

表示字符集

[abc]与字符a、b或c一致,[a-z]与所有小写字母一致,[a-zA-Z0-9]与所有字符和数字一致,[^6]表示除6以外的任意字符

|

或者,只匹配一个表达式

在a一致的情况下,A|B不再搜索b,反之亦然

(…) ) ) )。

匹配括号中的任意正则表达式

(? # . )

注释,忽略括号中的内容

(?=…)

表达式’…’前面的字符串

在字符串“pythonretest”中(=test )匹配“pythonre”

(?)

表达式’…’后面的字符串

如果“pythonre”后面没有字符串“test”(! test )与’python re’匹配

(?=…)

表达式’…’后面的字符串与括号后的正则表达式匹配

正则表达式’(?=abc ) def )在abcdef中与def匹配

(?

括号后的正则表达式不跟在“…”之后

含有’’的特殊序列的意义见表2-2。

表2 .正则表达式的特殊序列

特殊表达式序列的含义

A

仅在字符串的开头匹配。

b

匹配开头或结尾的空字符串

B

匹配不在开头或结尾的空字符串

d

与任意十进制数一致,相当于[0-9]

D

与任意数字以外的字符一致相当于[^0-9]

s

匹配任意空白字符,相当于[ tnrfv]

S

匹配除空白以外的任何字符相当于[^ tnrfv]

w

使任意数字与字母一致相当于[a-zA-Z0-9_]

W

使任意数字与非字母字符一致相当于[^a-zA-Z0-9_]

Z

仅在字符串的末尾匹配

Python re的主要功能

Python的re正则表达式模块定义了一组函数、常量和异常。 另外,正则表达式编译到“‘regexobject”实例中,它本身可以为不同的操作提供方法。 接下来,我们将简要介绍这些函数的功能和使用方法。

康布尔

re.compile(Pattern ),fl

ags])

把正则表达式的模式和标识转化成正则表达式对象,供 match() 和 search() 这两个函数使用。

re 所定义的 flag 包括:

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

例:以下两种用法结果相同:

A)

B)

search

re.search(pattern, string[, flags])

在字符串中查找匹配正则表达式模式的位置,返回 MatchObject 的实例,如果没有找到匹配的位置,则返回 None。

对于已编译的正则表达式对象来说(re.RegexObject),有以下 search 的方法:

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

若 regex 是已编译好的正则表达式对象,regex.search(string, 0, 50) 等同于 regex.search(string[:50], 0)。

具体示例如下。

match

re.match(pattern, string[, flags])

判断 pattern 是否在字符串开头位置匹配。对于 RegexObject,有:

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

match() 函数只在字符串的开始位置尝试匹配正则表达式,也就是只报告从位置 0 开始的匹配情况,而 search() 函数是扫描整个字符串来查找匹配。如果想要搜索整个字符串来寻找匹配,应当用 search()。

split

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

此功能很常用,可以将将字符串匹配正则表达式的部分割开并返回一个列表。对 RegexObject,有函数:

split(string[, maxsplit=0])

例如,利用上面章节中介绍的语法:

对于一个找不到匹配的字符串而言,split 不会对其作出分割,如:

findall

re.findall(pattern, string[, flags])

在字符串中找到正则表达式所匹配的所有子串,并组成一个列表返回。同样 RegexObject 有:

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

示例如下:

finditer

re.finditer(pattern, string[, flags])

和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并组成一个迭代器返回。同样 RegexObject 有:

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

sub

re.sub(pattern, repl, string[, count, flags])

在字符串 string 中找到匹配正则表达式 pattern 的所有子串,用另一个字符串 repl 进行替换。如果没有找到匹配 pattern 的串,则返回未被修改的 string。Repl 既可以是字符串也可以是一个函数。对于 RegexObject 有:

sub(repl, string[, count=0])

此语法的示例有:

同样可以用以下方法,并指定 count 为 1(只替换第一个):

>>> p.sub( 'num', ' one word two words three words', count=1)

' num word two words three words'

subn

re.subn(pattern, repl, string[, count, flags])

该函数的功能和 sub() 相同,但它还返回新的字符串以及替换的次数。同样 RegexObject 有:

subn(repl, string[, count=0])

实例分析 - 使用 re 模块实现美剧时间表

这一章节将描述使用 re 模块进行文本解析并实现美剧播出时间表小工具的细节。我们会引用实际的代码片段,解释在实际程序中,应当如何使用 re 模块实现文本解析的功能。

需求分析

为了将我们感兴趣的信息全部提取出来渲染到一个单独的页面上,我们选取 www.tv.com 的 html 作为数据源,获取到其 HTML 文本之后用正则表达式解析并获得相关内容。

请注意用正则表达式分析 HTML 或 XML 是痛苦的。随处可见的变化使得写出一个通用的正则表达式变得极为困难,象这样的任务使用专用的 HTML 或 XML 解析器更为适宜 ( 如 http://www.crummy.com/software/BeautifulSoup/, 值得一提的是,这个解析器也是用 Python RE 实现的 ),为了演示 Python RE 的使用,本文全部使用正则表达式处理文本。

实现步骤

因为此工具的最后结果会被呈现在一个网页上,它的主要功能就是从上述的 html code 中提取出我们感兴趣的 element, 并按照我们自己的对内容的选择重新生成一个个性化过的页面,请参见附件查看我们将要解析的 html 文本。

通过检视此 html 文件,我们需要提取的 html element 只有被 head 标签修饰的文档信息元素,和被 div 标签修饰,id 值为 episode_listing 的块级区域。

下面对实现这部分功能的主要代码进行一些分析。

以只读方式打开所需处理文本并读入其内容:

读取剧集标题,使用正则表达式匹配以“

”结束的元素,注意此处使用非贪婪匹配以获取首次匹配的内容:

查看一下变量类型和内容:

读取 html 文本中 id 值为 episode_listing 的 div 元素,注意由于此元素会跨越多行,我们在调用 findall 函数时需要指定 re.S 标志,同样使用非贪婪匹配:

fd_result = re.findall("

", fh_str, re.S)

此时我们已经获取到全部所需内容,将他们写入另一个 html 文件:

结果演示

本章节将演示实例效果,展示最终可以显示在网页上的运行结果,我们将看到解析获得的美剧时间表,剧集标题等。为此我们在 Google App Engine 上创建了一个 Demo 示例以更好的对此本文所介绍的内容进行演示,读者可以直接访问使用。示例的网址如下:

下面我们用截图来说明该示例的内容。该示例主要展示了对给定的包含美剧信息的 URL 所截取出来的剧集播放信息,如下图所示本示例展示如下三部美剧的信息:

图 1. 美剧信息 URL

其输出结果如下:

图 2-1. URL 所对应剧集播出时间表

图 2-2. URL 所对应剧集播出时间表

图 2-3. URL 所对应剧集播出时间表

另外,我们还为读者提供了亲自体验的 Play Ground,读者可以通过点击主页面最下方的相关链接(http://omtvdw.appspot.com/pg)来到如下界面:

图 3. 自行获取指定美剧播出时间界面

在此界面里,读者可以自行输入含有美剧播出信息的相关页面的链接,然后查看输出结果。例如我们输入 http://www.tv.com/24/show/3866/episode.html?shv=list&season=5,然后点击“Get Air Date List”就会看到关于 24 小时第五季的播出信息:

图 4. 运行结果

读者可以自行试验获取其他美剧的信息,但是需要自己从 www.tv.com 上找到类似的 URL。

小结

尽管对于 Python 正则表达式模块(re)的语法和相关函数的描述并不全面,但文章以简洁的方式介绍了最常用的正则表达式语法和函数调用方法,关于更为复杂和深入的用法讨论,读者可以参考官方文档。在之后的章节中,本文直观地通过网页文本解析的实例,讲解了美剧播出时间解析小工具的实现方法和步骤,希望最后的网站示例和演示结果能够提供给这一模块的功能学习提供一些有趣并有用的帮助。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。