正则表达式学习(超详细)

正则表达式学习

1. 什么是正则表达式

  1. 正则表达式(简称为regex)是由字符和特俗符合组成的字符串

  2. 能够按照某种模式匹配一系列有相似特征的字符串

    [工具]

2. 正则表达式中的符号

符号描述示例正则测试案例结果
literal匹配文本字符串的字面值literalfooaabaabbsaab
re1|re2匹配正则表达式re1或者re2foo|nameaabsaabbsaa
bs
.匹配任何字符(除了\n之外)b.b^aab.aabbsaabb
^匹配字符串起始部分^Name
$匹配字符串结束部分name$
*匹配0次或者多次前面出现的正则表达式[A-Za-z0-9]*
+匹配1次或者多次前面出现的正则表达式[a-z]+.\com
?匹配0次或者1次前面出现的正则表达式name?
{N}匹配N次前面出现的正则表达式[0-9]{3}
{M,N}匹配M-N次前面出现的正则表达式[0-9]{5,9}
[…]匹配来自字符集的任意单一字符[name]
[…x-y…]匹配x-y范围中的任意单一字符[0-9],[A-Za-z]
[^…]不匹配此字符集中出现的任何个一个字符,包括某一范围的字符(如果在此字符集中出现)[name],[A-Za-z0-9]
(*|+|?|{})?用于匹配上面频繁出现/重复出现符合的非贪婪版本(*、+、?、{}).*?[0-9]
(…)匹配封闭式的正则表达式,然后另存为子组([0-9]{3})?,f(oo|u)bar

3. 正则表达式中的特殊字符

匹配特俗字符需要\转义

特殊字符描述示例正则测试案例结果
\d匹配任何十进制数字,与[0-9]一致(\D与\d相反,不匹配任何非数值型的数字)data\d+.txt\w{3}gaghah3221322
\w匹配任何字符数字字符,与[A-Za-z0-9_]相同(\W 与之相反)[A-Za-z]\w+\w{3}gaghah3221gag
hah
322
\s匹配任何空格字符,与[\t\r\n\v\f]相同(\S与之相反)of\stheh\s{3}31h 32h 3
\b匹配任何单词边界(\B与之相反)\bThe\b
\N匹配已保存的子组Nprice:\16
\c逐字匹配任何特俗字符c(即,仅按照字面意义匹配,不匹配特俗含义)., \ , *
\A(\Z)匹配字符串的起始(结束)\ADear

3.1 特殊字符使用\ 转义

例如: .\com

maicheng.com => .com

3.2 指定匹配选项

3.2.1. 使用[]指定要匹配的集合

[abc]{2} 指定匹配任意abc 两个字符的集合

字符 : aabbsabc

结果:aa bb ab

3.2.2 使用[^]指定不要匹配的内容

[^abc]{2} 指定不匹配abc 两个字符的集合

字符:aabbs1abc

结果 : s1

3.3 正则表达式分组

3.3.1 重复一个字符串时

3.3.2 使用() 进行分组,使用(?\w+)指定组名

  1. (\d{1,3}.){3}\d{1,3} 187.154.251.14 => 187.154.251.14
3.3.3 从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此内推
  1. 使用 \1 \2 反向引用

    字符

    He love is small lover
    He like is small liker

    正则

    He (l…) is small \1r

    He (?l…) is small \kr

3.3.4 表达式(A(B©))分组情况解析
0(A(B©))
1(A)
2(B©)
3©

3.4 贪婪模式和非贪婪模式

3.4.1 贪婪匹配

在整个表达式匹配成功的前提下,尽可能多的匹配

表达式 : ab.+c

测试数据 : abassscssscsss

结果 : abassscsssc

3.4.2 非贪婪匹配

在整个表达式匹配成功的前提下,匹配到就结束

只需要在匹配pattern中加上?

表达式 : ab.*?c

测试数据 : abassscssscsss

结果 : abasssc

3.5 练习

3.5.1 身份证匹配

案例 320723 1887 04 14 7487

  1. 前六位区域编号

  2. 接下来四位是出生年份

  3. 接下来四位月份日期

  4. 随后四位

  5. 倒数第二位 : 性别

    表达式 : \d{17}([0-9]|X)

    第二版 :(\d{6})(\d{4})((\d{2})(\d{2}))\d{2}\d{1}([0-9]|X)

https://tool.oschina.net/regex)

4. re 模块

属性描述
re.I re.INGORECASE不区分大小写的匹配
re.L re.LOCALE根据所使用的本地语言环境通过\w、\W、\b、\B、\s、\S实现匹配
re.M re.MULTILINE^和$分配匹配目标i字符串中行的起始和结尾,而不是严格匹配整个字符串本身的起始和和结尾
re.S re.DOTALL“.”(点号)通常匹配除了\n (换行符)之外的所有单个字符;该标记表示“.”,(点号)能够匹配全部字符
re.X re.VERBOSE通过反斜线转义,否则所有空格加上# (以及在改行中所有后续文字)都被忽略,除非在一个字符类中或者允许注释并且一高可读性

4.1 compiler

  1. compiler(pattern, flags=0)
  2. 使用任何可选的标记来编译正则表达式的模式,然后返回一个正则表达式对象
  3. 推荐编译,但它不是必须的

4.2 match

  1. match(pattern, string, flags=0)

  2. 尝试使用带有可选标记的正则表达式的模式来匹配字符串,如果成功,就返回匹配对象,如果匹配失败,就返回None

  3. 练习

    import re
    
    pattern = re.compile(r'hello', re.I)
    result = pattern.match('Hello world')
    
    # 输出包含哪些正则
    print(dir(pattern))
    
    print(dir(result))
    
    # 输出结果
    print(result.string)
    

4.3 findall() 的使用

  1. findall(pattern, string, [,flags])

  2. 查找字符串中使用所有(非重复)出现的正则表达式模式,并返回一个匹配列表

  3. 练习

    import re
    
    content = 'one12two32three34four11'
    
    p = re.compile(r'[a-z]+', re.I)
    
    list = p.findall(content, )
    
    print(list)
    

4.4 search的使用

  1. search(pattern, string, [,flags])

2.尝试使用带有可选标记的正则表达式的模式来匹配字符串,如果成功,就返回匹配对象,如果匹配失败,就返回None

  1. 练习

    import re
    
    pattern = re.compile(r'world', re.I)
    result = pattern.search('Hello world')
    
    # 输出结果
    print(result.string)
    

4.5 group()和groups() 使用

  1. group(num) 返回整个匹配对象或编号为num的特定子组

  2. groups(): 返回一个包含所有匹配子组的元祖(如果没有成功匹配,则返回一个空元祖)

  3. 练习

    import re
    
    pattern = re.compile(r'world', re.I)
    result = pattern.search('Hello world')
    
    
    if result is not None:
        print(pattern.groups)
    
    
    def id_card():
        content = '320723188704147487'
        pattern = re.compile(r'(\d{6})(?P<year>\d{4})((?P<month>\d{2})(\d{2}))\d{2}\d{1}([0-9]|X)')
        result = pattern.search(content)
        print(result.group())
        print(result.group(1))
        print(result.group(5))
        print(result.groupdict(5))
    
    
    
    if __name__ == '__main__':
        id_card()
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u7lb7zPh-1668332297693)(C:\Users\maido\AppData\Roaming\Typora\typora-user-images\image-20221113171059739.png)]

    4.6 spilt 分割

  4. spilt (pattern, string, [,flags])

  5. 分割字符串中使用所有(非重复)出现的正则表达式模式,并返回一个匹配列表

  6. 练习

    import re
    
    content = 'one12two32three34four11'
    
    p = re.compile(r'\d+', re.I)
    
    # 2 表示分割几位
    list = p.split(content, 2)
    
    print(list)
    

4.7 替换

  1. sub(spilt (pattern, string, flags=0)

  2. 替换字符串中使用所有(非重复)出现的正则表达式模式,并返回一个匹配列表

  3. 练习

    import re
    
    content = 'one12two32three34four11'
    
    p = re.compile(r'\d+', re.I)
    
    list = p.sub('@', content)
    
    print(list)
    
    # 替换位置
    s2 = 'hello world'
    p2 = re.compile(r'(\w+) (\w+)')
    
    result = p2.sub(r'\2 \1', s2)
    
    print(result)
    
    
    def f(m):
        """使用函数进行替换规则改变"""
    
        return m.group(2).upper()  + ' '  + m.group(1)
    
    result_sub = p2.sub(lambda m: m.group(2).upper()  + ' '  + m.group(1), s2 )
    
    print(result_sub)
    

4.8 读取页面图片地址

  1. <img.+?src=“(.+?)”.+?>
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python爬虫学***基础知识,包括语法、数据类型、循环和条件语句等。这些知识是编写爬虫代码的基础。 2. 学习Python的相关库和框架,如requests、BeautifulSoup、Scrapy等。这些库和框架能够帮助我们更方便地进行网络请求和解析网页内容。 3. 学习HTTP协议和网页结构,了解网页的基本组成和常见的HTML标签。这些知识对于理解网页的结构和提取所需数据非常重要。 4. 学习XPath和正则表达式,它们是爬取和解析网页内容的重要工具。XPath可以帮助我们通过路径表达式快速定位网页的元素,而正则表达式则可以用于匹配和提取特定的文本模式。 5. 学习反爬虫机制和应对策略,了解网站常见的反爬虫手段,如IP封禁、验证码等,并学习相应的应对方法,如使用代理IP、验证码识别等。 6. 学习数据存储和处理,包括将爬取的数据保存到本地文件或数据库,并进行进一步的处理和分析,如数据清洗、数据可视化等。 7. 实践项目,通过完成一些实际的爬虫项目来巩固所学知识,并提升自己的实际操作能力。可以选择一些简单的网站进行爬取,如电影、新闻等,逐步提升难度和复杂度。 总之,Python爬虫学习路线包括学习Python基础知识、相关库和框架、HTTP协议和网页结构、XPath和正则表达式、反爬虫机制和应对策略、数据存储和处理,以及实践项目。通过系统地学习和实践,可以逐步掌握Python爬虫开发的技术与方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python爬虫](https://blog.csdn.net/weixin_49892805/article/details/128041831)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [牛逼!Python爬虫学习的完整路线推荐(史上全,建议收藏)](https://blog.csdn.net/m0_74942241/article/details/128938655)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值