Python之正则模块

re(正则)模块

  1. 正则模块,在python中用来操作正则表达式的模块。用来校验字符串的合法性,爬虫等。

  2. 正则表达式,是一种用来匹配字符串内容的规则。(工具:regex)

  3. 元字符:一个字符所表示的内容

# 常用
.  匹配除了换行符以外的任意字符
\w 匹配字母数字或下划线
\s 匹配任意的空白符
\d 匹配数字
a|b 匹配字符a或字符b
()匹配括号内的表达式,也表示一个组
[...] 匹配字符组中的字符
[^...]在字符集里表示匹配除了字符组中的所有字符
# 比较常用
\n 匹配换行符
^ 匹配字符串的开始
$ 匹配字符串的结尾
# 不太常用
\t 制表符
\b 匹配单词的结尾
\W 匹配非字母数字或下划线
\D 匹配非数字
\S 匹配非空白符

   4. 量词:只表示前面一个字符的次数

*  重复零次或更多次
+  重复一次或更多次
? 重复零次或一次
{n}  重复n次
{n,}  重复n次或更多次
{n,m}  重复n到m次

   5. 贪婪匹配: 字符+量词,每个量词只控制前面一个字符的出现次数,这个两次的匹配方式就是贪婪匹配(尽量多的匹配)

  6. 非贪婪匹配: 字符+量词+?,常用 .*? + 任意字符,匹配到任意字符就返回

  7. 分组:约束多个字符集匹配次数

  8. 转义符,在正则里想表示换行符\n,需要写\\n,表示字符串"\n",要写\\\\n。

    python中,r"正则表达式",取消python中的各种转义符,无需再次转义

  9. 回溯算法:回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

    正则的贪婪匹配本质就是回溯算法。

  10. re模块的使用

import re
re.split("[ab]","afdbndf")---先按a去分割,再按b去分割

import re
re.sub("新的","旧的","需要替换的内容","次数")---替换

import re
ret = re.subn('\d', 'H', 'eva3egon4yuan4')#将数字替换成'H',返回元组(替换的结果,替换了多少次)
print(ret)

import re
obj = re.compile('\d{3}')  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
print(ret.group())  #结果 : 123

import re
ret = re.finditer('\d', 'ds3sy4784a')   #finditer返回一个存放匹配结果的迭代器
print(ret)  # <callable_iterator object at 0x10195f940>
print(next(ret).group())  #查看第一个结果
print(next(ret).group())  #查看第二个结果
print([i.group() for i in ret])  #查看剩余的左右结果

   11. re模块中的findall、search、compile方法

import re
ret = re.findall("正则表达式","要匹配的字符串")---直接返回一个列表,每个结果都是字符串,找不到返回空列表
print(ret)

ret2 =  re.search("正则表达式","要匹配的字符串")---匹配找到的第一个结果,找不到返回None
if ret2:
    print(ret2.group())

ret3 = re.match("正则表达式","要匹配的字符串")---只匹配从头开始匹配到的值,找不到返回None
if ret3:
    print(ret3.group())

  小结:在调用的角度上看没有区别,接受两个参数按照位置传,正则表达式和要匹配的字符串

  返回值的区别:
     re.findall(): 返回列表,匹配到的所有内容都会出现在列表中,如果没有匹配到返回空列表
     re.search(): 如果匹配到结果返回第一个匹配到的,如果没有匹配到返回None,返回值用group()方法取出来
    re.match(): 只匹配从头开始匹配到的第一个值,如果没有匹配到返回None,返回值用group()方法取出来

  12. re.findall()优先级问题

    分组的优先匹配,优先显示,只显示分组里的内容

    在分组里加 ?: 就可以全部显示了

  13. re.split()优先级问题

    如果先分组再分割,分隔符也会保留并输出

  14. 分组

    分组命名:(?P<name>\w+)

    分组赋值:(?P=name)  ?P<变量名>:只取到标签名

import re
ret = re.search("<\w+>\w+</\w+>","<h1>hello</h1>")
print(ret.group())


ret = re.search("<(?P<name>\w+)>\w+</(?P=name)>","<h1>hello</h1>")
print(ret.group())    # 全部取出来
print(ret.group("name"))    # 只取标签名


ret = re.search("<(?P<name>\w+)>(?P<a>\w+)</(?P=name)>","<h1>hello</h1>")
print(ret.group())    # 全部取出来
print(ret.group("name"))    # 只取标签名
print(ret.group("a"))    # 取到内容

    分组的用途

      对多个字符进行整体的量词约束

      对于一条匹配的正则,只对其中我需要的内容进行分组

 

 

posted @ 2019-11-08 14:43  chitalu  阅读(285)  评论(0编辑  收藏  举报