zoukankan      html  css  js  c++  java
  • Day 9:Python 字符串和正则介绍总结

    好像那里都是字符串?随手敲打键盘,网上copy一个句子,打开浏览器搜索什么。那么字符串的处理就很重要了。下面介绍基本字符串操作和一点儿正则表达

    基本操作

    反转字符串

    字面意思,把一个字符串按相反的顺序写出:

     字符串切片操作

    例子:生成1到15的序列,并在满足条件的索引处,替换为‘java’或者是‘python’

     join串联字符串

    常常会使用到用固定的符号来串联一个字符串

     分割字符串

    有的时候我们获得了一个大的字符串,里面包含了各种数据,或者是一组数据,就想把他们分开,使用split方法。

    split和join可以看作是在一定程度上的互逆操作。

     替换

    字符串替换,使用replace方法。

     子句判断

    判断一个字符串是否是另一字符串的一部分,内部函数就是两个len,然后走一个for循环就好。

     去空格

    去空格,去头尾的空格,以达到清洗字符串。使用strip方法,清理字符串开头和结尾的空格和制表符

    字符串的字节长度

    encode方法对字符串编码后,


    最近看了深夜食堂,红尘世间,我裂开了


     正则表达式

    处理简单的字符串操作,用自带的封装办法即可达到目的,但是稍微复杂那么一点点,使用正则表达式是明智的选择,简洁强大。

    re

    使用正则表达式第一步,导入re模块

    import re

    首先,认识常用的元字符:

    • . 匹配除 " " 和 " " 之外的任何单个字符
    • ^ 匹配字符串开始位置
    • $ 匹配字符串中结束的位置
    • * 前面的原子重复 0 次、1 次、多次
    • ? 前面的原子重复 0 次或者 1 次
    • + 前面的原子重复 1 次或多次
    • {n} 前面的原子出现了 n 次
    • {n,} 前面的原子至少出现 n 次
    • {n,m} 前面的原子出现次数介于 n-m 之间
    • ( ) 分组,输出需要的部分

    再认识常用的通用字符:

    • s 匹配空白字符
    • w 匹配任意字母/数字/下划线
    • W 和小写 w 相反,匹配任意字母/数字/下划线以外的字符
    • d 匹配十进制数字
    • D 匹配除了十进制数以外的值
    • [0-9] 匹配一个 0~9 之间的数字
    • [a-z] 匹配小写英文字母
    • [A-Z] 匹配大写英文字母

    正则表达式,常会涉及到以上这些元字符或通用字符,下面通过 14 个细分的与正则相关的小功能,讨论正则表达式。

    search第一个匹配串

    即find(),找出第一个匹配项的位置

     match与search不同

    • match 在原字符串的开始位置匹配
    • search 在字符串的任意位置匹配

    match想做的事就是在开头就find,最高效,啊抓到你了!

    比如,字符串 ourselves,ours 才能 match 到 our

    finditer 匹配迭代器

    finditer方法,返回所有子串匹配位置的 一个 迭代器。通过返回的对象 re.Match,使用它的方法 span 找出匹配位置。

     findall所有匹配

    findall 方法能查找出子串的所有匹配。

    下面例子,想要找出所有的数字

    d 匹配一位数字 [0-9],+ 表示匹配数字前面的一个原子 1 次或多次。

     但是有个问题是,日期9.7我显然不想让他们分开,怎恶魔版?修改正则表达式。

    匹配浮点数和整数

    • ? 表示前一个字符匹配 0 或 1 次
    • .? 表示匹配小数点(.)0 次或 1 次

    匹配浮点数和整数,第一版正则表达式:r'd+.?d+',图形化演示,此正则表达式的分解演示:

     

     1去哪里了?没有匹配全,所以正则表达式还要改。

    正则难点之一,需要考虑全面、足够细心,才可能写出准确无误的正则表达式。

    匹配不到1的原因是:r'd+.?d+',后面的 d+ 表示至少有一位数字,因此,整个表达式至少会匹配两位数。

    重新修改正则表达式,将最后的 + 后修改为 *,表示匹配前面字符 0 次、1 次或多次。

     成功!

    匹配正整数

    题:写出匹配所有正整数的正则表达式。

    如果这样写:^d*$,会匹配到 0,所以不准确。

    如果这样写:^[1-9]*,会匹配 1. 串中 1,不是完全匹配,体会 $ 的作用。

    正确写法:^[1-9]d*$,正则分解图:

     

    re.I 忽略大小写(I 大写的i) 

    re.I 是方法的可选参数,表示忽略大小写。

    如下,找出字符串中所有字符 t 或 T 的位置,不区分大小写。

    split 分割单词

    对于比较复杂的分割:

     正则字符串为:[,s;|]+s 匹配空白字符,正则分解图,如下:

    sub 替换匹配串

    正则模块,sub 方法,替换匹配到的子串:

    compile 预编译

    到这个时候上面出现了几次compile,你是否有疑惑过,为什么指派pat的时候有时候用compile而常常不用?

    如果要用同一匹配模式,做很多次匹配,可以使用 compile 预先编译串。

    栗子:从一系列字符串中,挑选出所有正浮点数。

    正则表达式为:^[1-9]d*.d*|0.d*[1-9]d*$,字符 a|b 表示 a 串匹配失败后,才执行 b 串,正则分解图见下:

    案例-捕获

    正则模块中,根据某个模式串,匹配到结果。

    待爬取网页的部分内容如下所示,现在想要提取 <div> 标签中的内容。

    content = '''
         <h>ddedadsad</h>
         <div>graph</div>
         <div>math</div>'''

    如果正则匹配串写做 <div>.*</div>

     如果我们不想保留字符串最开始的 <div> 和结尾的 </div>,那么,就需要使用一对 () 去捕获

     正则匹配串修改为:<div>(.*)</div>,只添加一对括号。

    • 看到结果中已经没有开始的 <div>,结尾的 </div> 仅使用一对括号,便成功捕获到我们想要的部分。
    • (.*) 表示捕获任意多个字符,尽可能多地匹配字符,也被称为贪心捕获
    • (.*) 的正则分解图如下所示,. 表示匹配除换行符外的任意字符。

    看另一种捕获方法:

     匹配模式串 (.*?),被称为非贪心捕获。正则图中,虚线表示非贪心匹配。

  • 相关阅读:
    鸽巢原理(The Pigeonhole Principle)(抽屉原理)
    VS2010显示行号
    HDU 2546 饭卡
    组合数学之排列组合(Permutations and Combinations)(四种情况)
    php中的$_SERVER方法初识
    重新认识hasLayout——IE浏览器css bug的一大罪恶根源 转
    javascript实现简单的链式调用
    Javascript 静态类的实现
    Object类相关的属性,方法和操作符
    <转>前端开发中的MCRV模式
  • 原文地址:https://www.cnblogs.com/PiaYie/p/14298344.html
Copyright © 2011-2022 走看看