2019–4-20
补充:

?    表示 0次或者1次前面的分组
+  表示1次,2次,……n次前面的分组
*   表示0次,1次,2次,……n次前面的分组

^spam 表示字符串必须以spam开始
spam$ 表示字符串必须以spam结束
.匹配所有字符,换行符除外
\d \w \s 分别匹配数字、单词、空格
[abc] 这是自定义分组,匹配方括号内的任意字符
{}? 表示采用非贪心模式
<>? 左尖括号,右尖括号,问好,也是表示非贪心模式

问题一:什么是正则表达式?
正则表达式,又称规则表达式。Regular Expression,import re #使用正则表达式

正则表达式是一个特殊的字符序列,检验一个字符串是否与我们所设定的字符序列相匹配用于快速检索文本,实现一些替换文本的操作
功能:
1.检查一串数字是否是电话号码
2.检测一个字符串是否符合email
3.把一个文本里指定的单词替换为另外一个单词

正则表达式的灵魂在于 规则!!!
数据处理工作,正则表达式必不可少!!
Python是默认的贪婪模式!!!

#实例一   检验普通字符'Python'
import re    #  re模块  里面有很多方法供我们操作正则表达式
a = 'C3C++2Java7Python5Javascript'
r = re.findall('Python',a)    #找一个变量接收这个结果,并且把它打印出来
print(r)
if len(r)>0: 
    print('字符串中包含Python')
else:
    print('no')
#实例二    检验元字符'\d'
import re    #  re模块  里面有很多方法供我们操作正则表达式
 #正则表达式的灵魂在于   规则!!!
a = 'C3C++2Java7Python5Javascript'

#python提供    '\d'表示数字0~9
r = re.findall('\d',a)    #找一个变量接收这个结果,并且把它打印出来
print(r)

字符集
出现在字符集里是 ‘或’的关系[cf]是c或f
\d 数字字符 \D 非数字字符
\w 单词字符 \W 非单词字符
\s 空白字符 \S 非空白字符
. 匹配除换行符\n之外其他所有字符

#数量词
#*   匹配*前面的字符0次或者无限多次
#+   匹配+前面的字符1次或者无限多次
#?   匹配?前面的字符0次或者1次  (检测到多于1次,但系统自动保留1次) 起到去重的作用

实例三
import re
s = 'pytho0python1pythonn2'
r = re.findall('python*',s)         #检测字符‘n   Python是默认的贪婪模式.因此也能检测到'pytho'
#贪婪  与  非贪婪
print(r)
实例四
#贪婪  与  非贪婪
#非贪婪模式尽可能少地匹配所搜索的字符串
#而默认的贪婪模式则尽可能多地匹配所搜索的字符串。
#例如,对于字符串“oooo”,“o+”将尽可能多地匹配“o”,得到结果[“oooo”],而“o+?”将尽可能少地匹配“o”,得到结果 ['o', 'o', 'o', 'o']

import re
s = 'python   1111java678php'

r = re.findall('[a-z]{3,6}',s)  #贪婪模式 ['python', 'Java', 'php']
#r = re.findall('[a-z]{3,6}?',s)  #非贪婪模式  ['pyt','hon','jav','php']

print(r)
#边界匹配
import re
qq = '100000000001'
#4-8
r = re.findall('^000$',qq)  #   ^表示从开头开始匹配,$表示从末尾开始匹配
print(r)

#[abc]中括号里面是  或   的关系
#(abc)小括号里面是  且  的关系
#字符串的替换  re.sub
import re
language = 'PythonC#JavaC#PHPC#'


#意义特别重大!!!
#把函数当成参数传入到re.sub列表里面
def convert(value):
    matched = value.group()
    return '!!' + matched +'!!'


r = re.sub('C#',convert,language)   #'C#'就是要匹配的正则表达式   
print(r)

# language=language.replace('C#','GO')
# print(language)   #因为string是不可变类型,如果变,要新生成string
#把函数当做参数传递
import re
s = 'A8C3721D86'

#意义特别重大!!!
#把函数当成参数传入到re.sub列表里面
def convert(value):
    matched = value.group()
    if int(matched) >= 6:
        return '9'    #传入一个string,也要返回一个string。检测的是数字,但源头是‘A8C3721D86’
    else:
        return '0'

r= re.sub('\d',convert,s)   #每找到一次数字,就将调用convert函数一次。因此编写convert函数就将控制数字的改变
print(r)
#match和search函数   (推荐使用findall,,不推荐使用match  search)

import re

s='83C72D1D8E67'

r=re.match('\d',s)  #'\d'就是正则表达式 pattern  从首字母开始匹配,如果没匹配到,返回None  
print(r.group())           #返回值是个object   
r1=re.search('\d',s)#搜索整个string,直到找到返回   
print(r1.span())
r2=re.findall('\d',s)
print(r2)       #match search只会匹配一次,findall会返回所有结果
#分组,还是推荐findall()
#提取s中' is short,i use '
import re

s = 'life is short,i use python'
# r= re.search('life(.*)python',s)
# print(r.group(1))    实现了提取s中' is short,i use '
r= re.findall('life(.*)python',s)
print(r)