python正则表达式

发布时间:2019-03-16 00:01:23编辑:auto阅读(1948)

    笔记:
    一:简介
    正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
    主要介绍Python中常用的正则表达式处理函数
    提高工作效率,完成内置函数无法完成的任务!
    搜索常用正则表达式!----->提高工作效率!
    有意识的多食用正则表达式!
    作用是快速检索文本,实现一些替换文本的操作。
    检测一串数字是不是电话号码,字符串是不是email,字符串的替换。

    二:re.findall函数

    在字符串中匹配正则表达式,返回形式为列表!

    number1 = re.findall(r'\d+', string1)
    (1)'python' 普通字符,
    (2)'\d'元字符---->百度百科元字符
    (3)字符集 a[bf]c
    (4)概括字符集
    # 数字[0-9] 非数字[^0-9] 字符'\D'
    # \w == [0-9A-Za-z_] 匹配单词字符 \W 匹配非单词字符
    # \D \d
    # \s 空白字符 \S 非空白字符
    (5)数量词 [a-z]{3,6}?
    (6)边界匹配 '^\d{4,8}$
    (7)匹配模式(flags
    re.I 使匹配对大小写不敏感
    re.L 做本地化识别(locale-aware)匹配
    re.M 多行匹配,影响 ^ 和 $
    re.S 使 . 匹配包括换行在内的所有字符
    re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
    re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

    二:re.sub函数(正则替换)
    re.sub用于替换字符串中的匹配项
    re.sub(pattern, repl, string, count=0)

    pattern : 正则中的模式字符串。
    repl : 替换的字符串,也可为一个函数。
    string : 要被查找替换的原始字符串。
    count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

    三:re.match函数
    re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none
    其他使用和findall函数完全相同
    re.match(pattern, string, flags=0)

    pattern:匹配的正则表达式
    string:要匹配的字符串
    flags:标志位

    四:re.search函数
    re.search 扫描整个字符串并返回第一个成功的匹配。
    re.search(pattern, string, flags=0)

    pattern:匹配的正则表达式
    string:要匹配的字符串
    flags:标志位
    代码:
      1 import re
      2 a = 'C|Python|Java|C#|Python|Javascript|Python'
      3 print(a.index('Python') > -1)   # 判断字符是不是在字符串中
      4 print('Python' in a)
      5 
      6 # -----------------------------------------------#
      7 # re.findall函数
      8 # -----------------------------------------------#
      9 # re.findall('正则表达式', a)--->使用关键为正则表达式为变量
     10 # ---------------------常量--------------------#
     11 r = re.findall('Python', a)
     12 if len(r) > 0:
     13     print("字符串中包含PHP")
     14 else:
     15     print("no")
     16 print(r)    # 输出结果用列表的形式存放
     17 
     18 # ----------------------元字符-----------------#
     19 string1 = 'C3Python4Java5C#6Python7Javascript8Python'
     20 # for in
     21 # 正则表达式
     22 
     23 number1 = re.findall(r'\d+', string1)
     24 # D表示非数字,d表示数字 + 表示连续查找!
     25 print(number1)
     26 
     27 # ---------------------字符集-----------------#
     28 string2 = 'afc, acc, adc, aec, abc, ahc'
     29 r = re.findall('a[bf]c', string2)   # 找出中间为b或者f的
     30 print(r)
     31 
     32 r = re.findall('a[^bf]c', string2)  # 找出中间不为b或者f的
     33 print(r)
     34 
     35 r = re.findall('a[c-f]c', string2)  # 连续字符
     36 print(r)
     37 
     38 # ---------------------概括字符集-----------------#
     39 # 数字[0-9] 非数字[^0-9] 字符'\D'
     40 # \w == [0-9A-Za-z_] 匹配单词字符  \W 匹配非单词字符
     41 # \D \d
     42 # \s 空白字符           \S 非空白字符
     43 
     44 string3 = 'afc, acc ahcdsfa sfa s f465 454 561_61'
     45 
     46 r = re.findall('[0-9A-Za-z_]', string3)  # 连续字符s
     47 print(r)
     48 
     49 # ---------------------数量词-----------------#
     50 
     51 string4 = 'python 11111java678php'
     52 r = re.findall('[a-z]{3,6}', string4)   # 贪婪模式匹配
     53 print(r)
     54 
     55 # 贪婪和非贪婪    Python倾向贪婪
     56 
     57 r = re.findall('[a-z]{3,6}?', string4)   # 非贪婪模式匹配
     58 print(r)
     59 
     60 # 匹配 * 前面的一个字符出现零次或者无限多次
     61 # 匹配 + 前面的一个字符出现1次或者无限多次
     62 # 匹配 ? 前面的一个字符出现0次或者1次(字符串的截取)
     63 # 匹配 . 匹配除了换行符\n之外的所有字符
     64 
     65 string5 = 'pytho0python1pythonn2'
     66 r = re.findall('python?', string5)
     67 print('string5:', r)
     68 
     69 # ---------------------边界匹配-----------------#
     70 # ^表示从开始匹配 $ 表示从末尾匹配
     71 
     72 qq = '107847'
     73 r = re.findall('^\d{4,8}$', qq)
     74 print(r)
     75 
     76 # ----------------------组-------------------#
     77 
     78 a = 'pythonpythonpythonpythonpythonpythonpython'
     79 r = re.findall('(python){2}', a)
     80 print(r)
     81 
     82 # ---------------------匹配模式------------------#
     83 
     84 a = 'pythonC#JavaPHP'
     85 r = re.findall('c#', a, re.I)
     86 print(r)
     87 
     88 
     89 # -------------------------------------------------#
     90 # re.sub函数
     91 # -------------------------------------------------#
     92 
     93 lanuage = 'PythonC#JavaPHP'
     94 r = re.sub('C#', 'Go', lanuage, count=0)
     95 # replace函数
     96 print(r)
     97 
     98 # 把函数当做参数传到sub函数中,对于不同的对象做不同的处理!
     99 
    100 
    101 def convert(value):
    102     print(value)
    103     matched = value.group()         # 获取匹配到的字符串
    104     return '!!' + matched + '@@'    # 对字符串修改
    105 
    106 
    107 r = re.sub('C#', convert, lanuage, count=0)
    108 # 把匹配到的字符串作为函数的实参传入函数中,并在函数中对匹配的字符串操作,
    109 # 返回替换后的字符串
    110 print(r)
    111 
    112 
    113 # -------------------------------------------------#
    114 # 函数作为参数的正则匹配例子
    115 # -------------------------------------------------#
    116 # 数字大于等于6的替换为9,小于等于6的替换为0
    117 
    118 def convert1(value):
    119     matched = value.group()
    120     matched = int(matched)  # 转换为数字
    121     if matched > 6:
    122         return '9'  # 只能返回字符串
    123     elif matched < 6:
    124         return '0'
    125     print(matched)
    126 
    127 
    128 s = 'A8C3721D86'
    129 r = re.sub('\d', convert1, s)
    130 print(r)
    131 
    132 # 软件设计思想: 一个函数用另一个函数作为参数
    133 # 接受一个值,返回一个值,不关心中间的处理过程
    134 
    135 # -------------------------------------------------#
    136 # search函数和match函数
    137 # -------------------------------------------------#
    138 s = '18C3721D86'
    139 r = re.match('\d', s)
    140 r = r.span()    # 拿出位置和值
    141 print(r)
    142 
    143 r = re.search('\d', s)
    144 r = r.group()
    145 print(r)        # 拿出值
    146 
    147 # -------------------------------------------------#
    148 # group分组-----()
    149 # -------------------------------------------------#
    150 # (爬虫的应用:根据标签找到标签中间的内容,不包括标签本身)
    151 s = 'life is short, i use python'
    152 r = re.search('life(.*)python', s)
    153 print(r.group(0))    # 获取分组后的匹配结果
    154 print(r.group(1))    # 获取分组后的匹配结果
    155 
    156 r = re.findall('life(.*)python', s)
    157 print(r)    # 获取分组后的匹配结果
    158 
    159 
    160 s = 'life is short, i use python, i love python'
    161 r = re.search('life(.*)python(.*)python', s)
    162 print(r.group(0))    # 获取分组后的匹配结果
    163 print(r.group(1))    # 获取分组后的匹配结果
    164 print(r.group(2))    # 获取分组后的匹配结果
    165 
    166 print(r.group(0, 1, 2))    # 获取分组后的匹配结果
    167 
    168 print(r.groups())           # 匹配结果

     

关键字