python 正则表达式 分组,python 正则 分组

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: