51Testing软件测试论坛

标题: python正则 [打印本页]

作者: 测试积点老人    时间: 2018-12-28 14:24
标题: python正则
特殊字符
扩展
方法

re.match re.search
match方法从字符串起始部份开始匹配,如果起始位置不符,就失败,结果为None
search方法不但会搜索字符串第一次出现的位置,而且严格地对字符串从左到右搜索 例子:

  1. 1.>>> m = re.match('foo','food')
  2. >>> m.group()
  3. 'foo'
  4. >>>
  5. 2. >>> m = re.match('foo','seefood')
  6. >>> m.group()
  7. Traceback (most recent call last):
  8.   File "<stdin>", line 1, in <module>
  9. AttributeError: 'NoneType' object has no attribute 'group'
  10. 匹配失败
  11. 3. >>> m = re.search('foo','seefood')
  12. >>> m.group()
  13. 'foo'
复制代码

匹配电子邮件:
  1. >>> import re
  2. >>> patt = '(\w+@\w+\.\w+)'
  3. >>> m = re.match(patt,'178919347@qq.com')
  4. >>> m.group()
  5. '178919347@qq.com'

  6. 分组:
  7. >>> import re
  8. >>> patt = '(\w+)@(\w+\.\w+)'
  9. >>> m = re.match(patt,'178919347@qq.com')
  10. >>> m.groups()
  11. ('178919347', 'qq.com')
  12. >>> m.group(1)
  13. '178919347'
复制代码

匹配字符串的起始和结尾以及单词边界

该操作一般用re.search,不用re.match,因为match()总是从字符串开始位置进行匹配

  1. >>> m = re.search('^The','The end.')    # 匹配开头
  2. >>> if m is not None:m.group()
  3. ...
  4. 'The'

  5. >>> m = re.search('^The','end. The')  #不作为起始,匹配不到
  6. >>> if m is not None:m.group()
  7. ...

  8. >>> m = re.search(r'\bthe','bite the dog')  #  在边界
  9. >>> if m is not None:m.group()
  10. ...
  11. 'the'

  12. >>> m = re.search(r'\bthe','bitethe dog')  # 有边界
  13. >>> if m is not None:m.group()
  14. ...

  15. >>> m = re.search(r'\Bthe','bitethe dog')  # 没有边界
  16. >>> if m is not None:m.group()
  17. ...
  18. 'the'
复制代码

使用findall()查找每一次出现的位置

findall()查询字符串中某个正则表达式模式全部的非重复出现的情况,与search()类似,但findall()总是返回一个列表,如没有匹配到内容,则返回空列表。

  1. >>> re.findall(r'car','carry the barcardi to the car')
  2. ['car', 'car', 'car']
复制代码

扩展符号

(?iLmsux)系列选项 i. (?i)忽略大小写

  1. >>> re.findall(r'(?i)the','The biggest one is the lion!')
  2. ['The', 'the']
复制代码

ii. (?m) 实现多行混合

  1. >>> re.findall('(?im)(^th[\w ]+)',"""
  2. ... This line is the first,
  3. ... another line,
  4. ... that line, it's the best
  5. ... """)
  6. ['This line is the first', 'that line']
复制代码

iii) (?s) 表示点号(.)能够用来表示\n符号(反之其通常用于表示出了\n之外的符号)

  1. >>> re.findall(r'th.+',"""
  2. ... The first line
  3. ... the second line
  4. ... the third line
  5. ... """)
  6. ['the second line', 'the third line']

  7. >>> re.findall(r'(?s)th.+',"""
  8. ... The first line
  9. ... the second line
  10. ... the third line
  11. ... """)
  12. ['the second line\nthe third line\n']
复制代码

iv. (?:...) 表示使用该符号,可以对部分正则表达式进行分组,但是不会保存

  1. >>> re.findall(r'http://(?:\w+\.)*(\w+\.com)','http://google.com http://www.google.com http://code.google.com')
  2. ['google.com', 'google.com', 'google.com']
  3. >>> re.search(r'\((?P<areacode>\d{3})\) (?P<prefix>\d{3})-(?:\d{4})','(800) 555-1212').groupdict()
  4. {'areacode': '800', 'prefix': '555'}
复制代码

(?P<name>)和(?P=name)符号,前者通过使用一个名称标识符而不是从1开始增加到N的数字来保存匹配,如果使用数字来保存匹配结果,我们就可以使用\1,\2...\N来检索。
v. (?=...)和(?!...)实现前视匹配,前者是正向前视断言,后者是负向前视断言。



匹配ip地址

IP地址格式可表示为:XXX.XXX.XXX.XXX,XXX取值范围是0-255,前三段加一个.重复了三次,在与最后一段合并及组成IP地址的完整格式。 所以IP地址的正则表示法如下:
((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))



匹配oabt004美剧网中首页的美剧名字和magnet地址,保存在dict中返回
  1. #!/usr/bin/env python
  2. # coding:utf-8
  3. import requests
  4. import re

  5. class GetMag(object):
  6.     def __init__(self):
  7.         self.result = dict()
  8.         self.res = None
  9.         self.mag = None
  10.         self.name = None
  11.     def getText(self,url):
  12.         self.res = requests.get(url).text
  13.     def getMag(self):
  14.         name_pat = re.compile(r'''class="name">(.*?)-''')
  15.         mag_pat = re.compile(r'''data-magnet="(.*?)"''')
  16.         self.mag = re.findall(mag_pat,self.res)
  17.         self.name = re.findall(name_pat,self.res)
  18.         for n in self.name:
  19.             for m in self.mag:
  20.                 self.result.update({n:m})
  21.         print(self.result)


  22. def main():
  23.     getmag = GetMag()
  24.     getmag.getText(url='http://oabt004.com/index/index?cid=1')
  25.     getmag.getMag()

  26. if __name__ == "__main__":
  27.     main()
复制代码




作者: Miss_love    时间: 2021-1-5 14:46
支持分享




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2