51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1954|回复: 1
打印 上一主题 下一主题

python正则

[复制链接]
  • TA的每日心情
    无聊
    10 小时前
  • 签到天数: 528 天

    连续签到: 1 天

    [LV.9]测试副司令

    跳转到指定楼层
    1#
    发表于 2018-12-28 14:24:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    特殊字符
    • \b \B
      \b用于匹配一个单词的边界,如 \bthe表示任意以the开头的字符串,\bthe\b匹配the
      \B将匹配单词中间的模式,如\B表示任何包含但不以the作为起始的字符串
    • [a-zA-Z]\w* 第一个字符是字母,第二个如果存在是字母或者数字
    • \d{3}-\d{3}-\d{4}: 匹配美国电话号码,前面是区号
    • \w+@\w+\.com : 匹配电子邮件地址

    扩展
    • (?:\w+\.)* 以句点作为结尾的字符串,如google. twitter.
    • (?=.com) 如果一个字符串以'.com'结尾才做匹配
    • (?!.net) 如果一个字符串不以'.net'结尾才匹配
    • (?<=800-) 如果字符串前为"800-"才匹配
    • (?<!192\.168\.) 如果字符串前不为'192.168.'才匹配,用于过滤掉一组c类ip地址
    • (?(1)y|x) 用于匹配组1,如存在就与y匹配,否则与x匹配

    方法

    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()
    复制代码



    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-18 19:59 , Processed in 0.058592 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表