my canteen
登录       注册

您现在的位置是:网站首页 > 学无止境

每日一技之re模块

王伟2020年4月2日241人围观
简介python的re模块主要应用正则表达式对字符串进行匹配筛选,也是爬虫入门的基础模块

python下的re模块简单使用

1.简单正则表达式语法

字符 描述
\d 数字:[0-9]
\D 非数字
\w 单词字符[A-Za-z0-9_]
\W 非单词字符
\s 匹配任何空白字符,包括空格、制表符、换页符等等。
\S 匹配任何非空白字符。
$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。
* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
. 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 。
[ 标记一个中括号表达式的开始。要匹配 [,请使用 [。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\' 匹配 "\",而 '(' 则匹配 "("。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 \^。
---

re模块的小方法

re.findall()

    re.findall(pattern, string, flags=0):
    #第一个参数,正则表达式
    #第二个参数,搜索的是那些字符串
    #第三个参数,匹配的模式,其中re.S使匹配包括换行在内的所有字符。
    findall()函数是逐行匹配的
    #返回string中所有与pattern相匹配的全部字串,返回形式为数组

findall 示例

    res = re.findall("a", "this is an example!")
    # 结果返回一个列表 这里可以清晰的看出findall的
    匹配机制
    res = ["a","a"]
    # 这里用findall解释一下 . 的匹配方式 
    res = re.findall(".","\n")
    #结果毫无疑问返回一个空列表 
    res = []
    # 那么我们如何用 . 匹配到换行符呢?
    # re.DOTALL或re.S这两个参数完美解决了这个问题。
    #一样的功能,该使用哪一个就不用说了吧!
    res  = re.findall(".", "\n",re.S)
    res = ["\n"]
    # 在我们实际使用的过程中,会发现这样一个问题
    a = '''<meta content="帅哥">
    <meta content="美女">
    <meta content="大叔">'''
    print(a)
    #结果是这样的
    <meta content="帅哥">
    <meta content="美女">
    <meta content="大叔">
    # 当我们在终端中时
    In[1]:a
    # 结果却是这样的
    Out[1]:'<meta content="帅哥">\n <meta content="美女">\n  <meta content="大叔">'
    re.findall("<.+>",a,re.S)
    # 结果是列表里只有一个元素。
    ['<meta content="帅哥">\n  <meta content="美女">\n   <meta content="大叔">']
    # 同理如果想要返回三个元素,可以去除re.S参数 让它不能匹配到换行符
    # 但我们还有一个方法就是使用非贪婪符号( ?)
    # 返回的结果也是三个元素
    re.findall("<.+>",a)
    re.findall("<.+?>",a,re.S)
    ['<meta content="帅哥">', '<meta content="美女">', '<meta content="大叔">']
    # 同样我们还可以搭配 () 的使用 取出我们需要的的值
    re.findall("<(.+?)>",a,re.S) 
    ['meta content="帅哥"', 'meta content="美女"', 'meta content="大叔"']
    re.findall("=\"(.+?)\"",a,re.S) 
    ['帅哥', '美女', '大叔']
    # 还有一个值得注意的点 就是 \ (转义符号) 
    # 示例
    'a\nb' == 'a\nb' # res: True
    # 但我们很多时候并不想让他转义,像我们要爬取一些网址的时候 \ 显得非常重要
    # 这时就要在正则表达式前使用 r 作用就是取消转义字符的转义
    r'a\nb' == 'a\nb' # res: False
    # 大家只要记住正则前面有 r 两个字符串符合正则就会匹配
    re.findall(r"a\nb","a\nb") # res: ['a\nb']
    re.findall(r"a\\nb","a\\\nb") # res: []
    re.findall(r"a\\\nb","a\\\nb") # res: ['a\\\nb']

re.search() 和 re.match()

    #re.search() 方法扫描整个字符串,并返回第一个成功的匹配。如果匹配失败,则返回None。

    #与re.search() 方法不同,re.match()方法要求必须从字符串
    #的开头进行匹配,如果字符串的开头不匹配,整个匹配就失败了;

    #re.search()并不要求必须从字符串的开头进行匹配,也就是说,正则表达式可以是字符串的一部分。
    #re.search(pattern, string, flags=0)
    #pattern : 正则中的模式字符串。
    #string : 要被查找替换的原始字符串。
    #flags : 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
    content = "wangwei18yizhihua"
    S = re.search(r"(?P<name>[a-z]*)(?P<age>\d+)", content)
    # S 是一个对象 搭配group使用来匹配需要的值
    # (?p<xxx>) 关键字参数匹配
    S.group() # res : 'wangwei18'  获取匹配到所有值
    S.group("name") # res : 'wangwei'
    S.group("age") # res : '18'
    # 我们也可以用()位置进行取值 当正则表达式比较简单时可以使用下面方法
    # 但是更推荐使用关键字 以便后期代码修改对取值产生的影响
    S.group(1) # res : 'wangwei'
    S.group(2) # res : '18'
    # 与re.search() 方法不同,re.match()方法要求必须从字符串的开头进行匹配,
    #如果字符串的开头不匹配,整个匹配就失败了,使用方法参考search()
    # 与这两种方法 我个人更喜欢findall() 大家也可以都使用 在不同情况下发挥最大的作用

re.sub()

    re.sub(pattern1,pattern2,string):
    # pattern1 需要匹配的字符(也就是正则)
    # pattern2 需要将匹配到的字符替换成的字符
    # string 匹配的字符串
    # re.sub可以实现替换功能

sub示例

    # 这个sub方法很简单就是根据正则匹配替换成我们需要的字符
    import re
    a = 'abc123xyz456'
    b = re.sub('\d+', '*', a)
    print(b) #abc*xyz*  
    # 当然关于sub函数的第二个参数也可以是一个函数
    import re
    def repl(obj):
    length = len(obj.group(0))
    return '*' * length
    y = re.sub('\d+', repl, 'abc123789xyz456')
    print(y)   # abc******xyz***

re.compile()

    # Compile a regular expression pattern,
    # returning a pattern object.
    compile(pattern, flags=0)
    #从compile()函数的定义中,可以看出返回的是一个匹配对象,它单独使用就没有任何意义,
    #需要和findall(), search(), match()搭配使用

compile()的定义:

    # 这个方法就是将正则表达式封装到了compile()函数中,起到一个预编译的作用。
    rex = re.compile("girl")
    # 示例
    ex_str = "I am a girl"
    # 搭配findall使用
    rex.findall(ex_str) # res: ["girl"]
    # 搭配sub使用
    rex.sub("boy",ex_str) # res:"I am a boy"
    type(rex) # res: re.Pattern
    # 如果不喜欢这个函数,也可以自己封装一个简单的小方法储存比较长的正则表达式。

这里有一些flags属性大家可以积极尝试,会发现不一样的乐趣。

属性 描述
re.A(re.ASCII) 让\w,\W,\b,\B,\d,\D,\s和\S 执行ASCII-只匹配完整的Unicode匹配代替。这仅对Unicode模式有意义,而对于字节模式则忽略。
re.I(re.IGNORECASE) 执行不区分大小写的匹配;类似的表达式也[A-Z]将匹配小写字母。
re.L(re.LOCALE) 让\w,\W,\b,\B和区分大小写的匹配取决于当前的语言环境。该标志只能与字节模式一起使用。不建议使用此标志,因为语言环境机制非常不可靠,它一次只能处理一种“区域性”,并且仅适用于8位语言环境。默认情况下,Python 3中已为Unicode(str)模式启用了Unicode匹配,并且能够处理不同的语言环境/语言。
re.M(re.MULTILINE) 指定时,模式字符'^'在字符串的开头和每行的开头(紧随每个换行符之后)匹配;模式字符'$'在字符串的末尾和每行的末尾(紧接在每个换行符之前)匹配。默认情况下,'^' 仅在字符串的开头,字符串'$'的末尾和字符串末尾的换行符(如果有)之前立即匹配。
re.S(re.DOTALL) 使'.'特殊字符与任何字符都匹配,包括换行符;没有此标志,'.'将匹配除换行符以外的任何内容。

re模块还有其他的几种方法 ,但是都大同小异。学会使用re模块并不难,重点是熟练掌握正则表达式匹配机制!

近期还会继续学习爬虫和一起简单的数据分析库!本网站是基于Django框架搭建,虽然目前一些基本的功能已经有了,但是距离一个合格的网站还有很大差距!近期会把学习成果更新到本网站,希望大家一起学习!共同进步!

路漫漫其修远兮,吾将上下而求索。


文章评论

来说句话吧.... 共有评论数:0条


微信二维码 博主微信 qq二维码 博主QQ
177****8743
7*24小时电话