python 正则表达式 分组,python 正则 分组
仅供学习,转载请注明出处。
匹配分组字符
功能
匹配左边和右边的任意表达式。
(ab)
将括号中的字符组合成一组。
\数量
引用分组编号匹配的字符串。
(?p名)
组别名
(?p=姓名)
引用是由名称分组匹配的字符串。
匹配任意表达式,相似或条件:当我们查询一个东西时,我们不一定要只查找它,我们可能还想同时查询另一个东西。所以前一个只是讲述了关于匹配查询的相同故事。
需求:匹配0到100之间的一个数字。
#编码=utf-8
进口re
在[3]: re.match([1-9]?\d , 8 )。群组()
out[3]:“8”
In [5]: re.match([1-9]?\d , 78 )。群组()
Out[5]: 78
#不正确的情况,因为[1-9]无法匹配0,那么就只是用\d来匹配0的结束,所以只会打印一个0,而不是8。
在[6]: re.match([1-9]?\d , 08 )。群组()
out[6]:“0”
#修正后,由于[1-9]无法匹配0,那么报错时ret为空,直接打印不在0到100之间。
In [14]: ret=re.match([1-9]?\d$100 , 08 )
在[15]中:如果ret:
.print(ret.group())
.否则:
.打印(“不在0-100之间”)
.
不在0到100之间。
在[16]中:
#把第一个字符改成[0-9],当然可以匹配08。
In [9]: re.match([0-9]?\d$ , 08 )。群组()
out[9]:“08”
#匹配100肯定会出错,因为这里只匹配了两个字符,所以需要用添加匹配类型。
在[17]: re.match([1-9]?\d$ , 100 )。群组()
-
AttributeError Traceback(最近一次调用)
模块中的ipython-input-17-6c1fe61a1e0d
- 1重配([1-9]?\d$ , 100 )。群组()
attribute error:“NoneType”对象没有属性“group”
在[18]中:
# Add 用于跟进一个人可以多判100个的情况。
在[18]: re.match([1-9]?\d$100 , 100 )。群组()
Out[18]: 100 括号中的字符为一组:(ab)上面写了可以用于or条件匹配,但没有限制。那是什么意思?
看看下面的例子就明白了。
需求:匹配163,126,qq邮箱。
#编码=utf-8
进口re
#首先,只需匹配一个163的电子邮件地址。
In [19]: re.match(\w{4,20}@163\)。com , test@163.com )。群组()
Out[19]: test@163.com
#所以这个要看163,126和qq的邮箱了。我应该直接加吗?结果,并不是。
In [20]: re.match(\w{4,20}@163qq126\)。com , test@163.com )。群组()
Out[20]: test@163
In [21]: re.match(\w{4,20}@163qq126\)。 com , qq )。群组()
Out[21]: qq
In [22]: re.match(\w{4,20}@163qq126\)。com , 126.com )。群组()
Out[22]: 126.com
在[23]中:
#从以上三个结果来看,似乎把整体拆分成三个规则来匹配。
#显然这不是我们想要的结果。显然还是范围不限。
#下面你可以用grouping()来限制范围或解决问题。
#我给(163qq126)加了括号,表示 this or判断只在这个括号内有效。
In [23]: re.match(\w{4,20}@(163qq126)\。com , 126.com )。群组()
-
AttributeError Traceback(最近一次调用)
模块中的ipython-input-23-fd220fc6f021
- 1 re.match(\w{4,20}@(163qq126)\。com , 126.com )。群组()
attribute error:“NoneType”对象没有属性“group”
#我看看,这个直接qq当然会匹配报错。
In [24]: re.match(\w{4,20}@(163qq126)\。 com , qq )。群组()
-
AttributeError Traceback(最近一次调用)
模块中的ipython-input-24-90ca396faa28
- 1 re.match(\w{4,20}@(163qq126)\。 com , qq )。群组()
attribute error:“NoneType”对象没有属性“group”
#然后输入正确的邮箱地址,再进行匹配,看是否正确。
In [25]: re.match(\w{4,20}@(163qq126)\。com , test@163.com )。群组()
Out[25]: test@163.com
In [26]: re.match(\w{4,20}@(163qq126)\。com , test@qq.com )。群组()
Out[26]: test@qq.com
In [27]: re.match(\w{4,20}@(163qq126)\。com , test@126.com )。群组()
Out[27]: test@126.com
在[28]中:
#从以上三个结果来看,匹配163、126和qq邮箱是非常正确的。
#最后,输入另一个未定义的hostmail邮箱当然是报错的结果。
In [28]: re.match(\w{4,20}@(163qq126)\。 com , test@hostmail.com )。群组()
-
AttributeError Traceback(最近一次调用)
模块中的ipython-input-28-a9b2cc3bf2e3
- 1 re.match(\w{4,20}@(163qq126)\。 com , test@hostmail.com )。群组()
attribute error:“NoneType”对象没有属性“group”
在[29]中:
需求:不以4或7结尾的手机号码(11位数)
in[29]:tels=[ 138000001234 , 18916844321 , 10086 , 18800007777]
In [35]:对于tels中的tel:
.ret=re.match(^1\d{9}[0-35-68-9]$,tel
.如果ret:
.打印( %s手机号码结果不以4或7结尾 % ret.group())
.否则:
.打印(“%s手机号码不是您要查找的“% tel”)
.
1800001234手机号不是你想找的。
1916844321手机号码结果不以4或7结尾
10086手机号不是你想找的。
1800007777手机号不是你想找的。
在[36]中:
提取区号和电话号码。
In [36]: re.match(\d{3,4}-?\d , 0755-12345678 )。群组()
Out[36]: 0755-12345678
in[37]:re . match((\ d { 3,4})-?(\d), 0755-12345678 )。群组()
Out[37]: 0755-12345678
in[38]:re . match((\ d { 3,4})-?(\d), 0755-12345678 )。组(1)
Out[38]: 0755
in[39]:re . match((\ d { 3,4})-?(\d), 0755-12345678 )。第二组
Out[39]: 12345678
#还有另一种匹配方式,使用开始匹配符号,然后写入需要匹配的最后一个符号-
[50]:re.match([^-]*,0755-12345678).在群组()
Out[50]: 0755
In [51]: re.match([-]*, 0755-12345678 )。群组()
Out[51]:
〔52〕re.match([^-]*,0755-12345678).群组()
Out[52]: 0755
[53]在re.match([^j]*,0755j12345678).群组()
Out[53]: 0755
[54]在re.match([^-]*,0755j12345678).群组()
Out[54]: 0755j12345678
[55]在re.match([^j]*,0755j12345678).群组()
Out[55]: 0755
在[56]:
[60]: re.match([^-]*-在吗?\d , 0755-12345678 )。群组()
Out[60]: 0755-12345678
在[61]: re.match(([^-]*)-?(\d), 0755-12345678 )。群组()
Out[61]: 0755-12345678
[62]: re.match(([^-]*)-在吗?(\d), 0755-12345678 )。组(1)
Out[62]: 0755
在[63]: re.match(([^-]*)-?(\d), 0755-12345678 )。第二组
Out[63]: 12345678
在[64]中:
#这种写法的优点是它匹配-符号之前的所有字符串。
[64]re.match(([^-]*)-?(\d), Abcdasdasd-12345678 )。第二组
Out[64]: 12345678
[65]: re.match(([^-]*)-?(\d), Abcdasdasd-12345678 )。组(1)
Out[65]: Abcdasdasd
In [66]:引用分组匹配的字符串num: \num爬虫匹配网页的HTML元素时经常用到这个函数。
让我们来看一个例子:
要求:匹配html你好美女/html
#编码=utf-8
进口re
#先匹配第一个html看看
In [66]: re.match( [a-zA-Z]* , html hello beauty /html )。群组()
Out[66]: html
#如果你用。*在后面,你确实可以匹配所有字符,但你不想在不使用后面的情况下再次分组()。
In [67]: re.match( [a-zA-Z]*。* , html你好美女/html )。群组()
Out[67]: html你好美女/html
#使用\w匹配字母、数字、下划线,但不匹配空格、制表符等。所以只是来打招呼的。
In [68]: re.match( [a-zA-Z]* \w* , html hello beauty /html )。群组()
Out[68]: html hello
# plus \s然后在两个\w之间匹配,那么这个空间的问题就可以解决了。剩下的就是匹配最后的/html了。
in[77]:re . match([a-zA-Z]* \ w * \ s \ w * , html hello beauty /html )。群组()
Out[77]: html你好美女
#把匹配规则写在最后就行了。
in[78]:re . match([a-zA-Z]* \ w * \ s \ w */[a-zA-Z]*, html hello beauty /html )。群组()
Out[78]: html hello beauty /html
在[79]
#但是,你可以看到匹配规则是大写和小写字母。html标签不一样怎么办?
in[80]:re . match([a-zA-Z]* \ w * \ s \ w */[a-zA-Z]*, html hello beauty /h )。群组()
Out[80]: html hello beauty /h
#虽然这也符合结果,但不是你想要的。最好的结果是结尾也应该是html。
#所以问题来了。很多时候,匹配这个可能会改变。不一定都是html。可能是你好。
在[81]:
#正确的理解思路:如果在第一对,就应该在后一对。
#只引用分组中匹配的数据,但要注意元字符串,也就是像R 这样的格式
in[89]:re . match(r ([a-zA-Z]*)\ w * \ s \ w */\ 1 , html hello beauty /html )。群组()
Out[89]: html hello beauty /html
in[90]:re . match(r ([a-zA-Z]*)\ w * \ s \ w */\ 1 , html hello beauty /html )。组(1)
Out[90]: html
#匹配内容的结尾写为上面的\1,所以是第一个括号直接分组的内容。
[91]中:从上面可以看出,括号()的分组在正则匹配中是可以引用的,所以如果这样的()太多了,肯定不方便写\1 \2 \3,那么下面有一个写名字的方法。
分组参考:(?p名)(?P=name)字符
功能
(?p名)
组别名
(?p=姓名)
引用是由名称分组匹配的字符串。
要求:匹配html h1 www.baidu.com/H1/HTML
#编码=utf-8
进口re
In [92]: re.match(r (?P name1 \w*)(?P name2 \w*)。* /(?P=name2) /(?P=name1), html h1 www.baidu.com/h1/html )。群组()
out[92]: html h1 www.baidu.com/h1/html
#将第二个H标签更改为h2,使其与h1不匹配。确认是否会报告错误。
In [94]: re.match(r (?P name1 \w*)(?P name2 \w*)。* /(?P=name2) /(?P=name1), html h1 www.baidu.com/H2/html )。群组()
-
AttributeError Traceback(最近一次调用)
模块中的ipython-input-94-f0034ed73d2c
- 1 re.match(r (?P name1 \w*)(?P name2 \w*)。* /(?P=name2) /(?P=name1), html h1 www.baidu.com/H2/html )。群组()
attribute error:“NoneType”对象没有属性“group”
在[95]:不过知道这种方式就好了,大部分都可以用\1 \2来匹配。
关注微信微信官方账号,回复【数据】,Python,PHP,JAVA,web,即可获取Python,PHP,JAVA,前端等视频数据。
来自海洋的渔夫原创作品,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。