PYTHON正则表达式分组的简单介绍

http://www.itjxue.com  2023-01-23 09:53  来源:未知  点击次数: 

python的正则表达式

1,正则表达式的一些内容

? ? ? ? 正则表达式主要是用来匹配文本中需要查找的内容,例如在一片文章中找出电话号码,就中国的来说11位纯数字(不说座机),则使用"\d{11}" 意味匹配数字11次,就能准确的查找出文本中的电话号码. 还有就是在编写网络爬虫的时候需要提取很多超链接再次进行爬取,使用正则表达式就很方便.直接匹配http开头就行,当然也可以使用beautifulsoup的select方法.

看下面的程序看看正则表达提取文本中的邮箱:

\w 匹配字母,数字,下划线?

+ 匹配1次或者多次

re是正则表达式的工具包,工具包出错的话在anaconda的命令行输入"pip install re"安装,其他的工具包也是如此.

re.compile()中的r示意\不是转义字符,也就是保持后面字符串原样,findall返回一个列表.下面还有一个版本的程序略有不同.

compile的另一个参数re.IGONORECASE(忽略大小写),还可以是re.DORALL,多行模式,具体功能也是模糊不清,不过在使用通配符 . 匹配的时候加上re.DOTALL参数能够匹配换行.如果希望忽略大小写和多行模式都开启可以使用re.compile(r'....',re.IGNORECASE|re.DOTALL) .

表达式使用( ),对匹配到的内容分为3组 也就是(\w+)出现字母,数字,下划线一次或多次,这个分组就是下面使用match对象的grou()方法的时候的参数.不给参数和参数0都是得到整个匹配到的内容,? 参数1得到第一个括号匹配到的内容,以此类推参数2和3,如果没有括号分组的话使用参数会出现错误.

search( )查找和正则式匹配的内容,只匹一次后面的那个找不到.返回一个match对象

\w 匹配字母,数字,下划线

\W 匹配字母,数字.下划线之外的所有字符

\d 匹配数字

\D 匹配非数字

\s 匹配空格,制表符,换行符

\S匹配除空格制表符,换行符之外的其他字符

[ .... ]定义自己的匹配,如[aeiouAEIOU ]匹配所有的元音字母,注意不是匹配单词.

{最少次数,最多次数},例如{3,9} 匹配3-9次,{ ,10}匹配0-10次. 默认为匹配最多次数(贪心匹配),非贪心模式在后面加上问号?

?? 可选 0次或者1次吧 ?

+匹配1次或多次

*匹配0次或者多次

^ 判断开头 ^\d 如果待匹配串是数字开头则返回第一个数字

$判断结尾? \d$? 如果待匹配串是数字结尾则返回最后一个数字

. ? 通配符,匹配除换行之外的所有字符

? ?\d{11}? 匹配数字11次

????. *?匹配所有字符除 换行

[a-zA-Z0-9._%+-] ?小写和大写字母、数字、句点、下划线、百分号、加号或短横

[a-zA-Z]{2,4} 匹配字母 2 - 4次

python 正则表达式 groups和group有什么区别?

group和groups是两个不同的函数。

一般,m.group(N) 返回第N组括号匹配的字符。

而m.group() == m.group(0) == 所有匹配的字符,与括号无关,这个是API规定的。

m.groups() 返回所有括号匹配的字符,以tuple格式。

m.groups() == (m.group(0), m.group(1), ...)

正则表达式中,group()用来提取分组截获的字符串,()用来分组。

组是通过 "(" 和 ")" 元字符来标识的。 "(" 和 ")" 有很多在数学表达式中相同的意思;它们一起把在它们里面的表达式组成一组。举个例子,你可以用重复限制符,象 *, +,??, 和 {m,n},来重复组里的内容,比如说(ab)* 将匹配零或更多个重复的 "ab"。

如果不引入括号,整个个表达式作为一个组,是group(0)

对于题目中的例子:

m = re.match("([abc])+", "abc")

+号在括号外面。括号最多匹配到一个字符,要么是a, 要么是c,这个python引擎匹配的是末尾的c。

而m.group() == m.group(0) 这个返回的是整个匹配的字符串"abc".

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

照旧,举个栗子吧

看了栗子是不是有点糊涂呢,我们来解析一下这个正则表达式

其结果匹配的就是 username@host.com 和 username@host.com 。

而不会匹配 user@host.com ' 和 user@host.com

但是上面的第三个结果为啥不一样呢?

因为 findall 允许返回空匹配的,在有 ? 的情况下,所以它会分两种情况去匹配

今天讲了一些扩展标记法,其实没那么难,多看看例子,多练习练习。

下节将介绍 re 模块各函数的用法,敬请期待......

python 34:正则表达式的search()方法和findall()方法得到的值

search()方法得到的值,其类型是re.Match对象。

findall()方法得到的值,其类型是list。

search()方法得到的值,其类型是对象re.Match。这个对象有自己的方法。

其中最常用的两个方法是group()和groups()。

group()方法的参数为一个非负整数。

group(0)是匹配字符串,group(1)为其第一个分组,group(2)为第二个分组,余类推。如果没有相应的分组,则抛出异常。

groups()可以有参数,也可以没有参数,其值与参数无关,所以就用无参数的形式。它的值为一个元组,其元素为所有分组。注意groups()的元素中不一定有匹配字符串,它只是所有分组。可以将整个正则表达式作为一个分组(在最外面加圆括号),这样其第一个元素就是匹配字符串。

findall()得到的值是一个列表。

这个列表的元素都是元组,每一个元组对应一个匹配,是这个匹配的所有分组。每一个元组与search()得到的值的groups()方法的值的性质一样。同样,元组中的元素不一定有匹配字符串,它们只是所有分组。可以将整个正则表达式作为一个分组(在最外面加圆括号),这样其第一个元素就是匹配字符串。

(责任编辑:IT教学网)

更多

推荐Frontpage教程文章