冀念1002

博客园 首页 联系 订阅 管理

一、简单的正则匹配

import re

a = "c++|c#|java|python|js|php"
# findall()的格式:re.findall("正则表达式规则", "源字符串")
# 将匹配到的所有字符全是展示出来,结果是一个列表
res = re.findall('python', a)
print(res)  # ['python']

二、概括字符集

# 正则是一个字符一个字符匹配的

#  \d  ---->  [0-9]  匹配数字
#  \D  ---->  [^0-9]  匹配非数字
#  \w  ---->  [a-zA-Z0-9_]  匹配数字字母(大小写)下划线
#  \W  ---->  [^a-zA-Z0-9_]  匹配非数字字母(大小写)下划线
#  \s  ---->  [ \f\n\r\t\v]  匹配任何不可见字符,包括空格、制表符、换页符等等
#  \S  ---->  [^ \f\n\r\t\v]  匹配任何可见字符
# . ----> 匹配除换行符\n之外所有的字符

三、匹配字符的长度

# 匹配的长度
#  *     ---->表示匹配0次或者无限次
#  +     ---->表示匹配1次或者无限次
#  ?     ---->表示匹配0次或者1次
#  {n,m} ---->表示最短n次,最长m次

s3 = 'pytho0python89pythonn'
res3 = re.findall('python*', s3)
res4 = re.findall('python+', s3)
res5 = re.findall('python?', s3)
res6 = re.findall('python*?', s3)
print(res3)  # ['pytho', 'python', 'pythonn']
print(res4)  # ['python', 'pythonn']
print(res5)  # ['pytho', 'python', 'python']
print(res6)  # ['pytho', 'pytho', 'pytho']多加了一个?表示匹配最小的次数(在这里是0次)就结束了
a = 'JavaScript3_2,php*7 %python32!@'
res = re.findall('[a-zA-Z]{3,10}', a)
print(res)  # ['JavaScript', 'php', 'python']
# 这里存在一个贪婪匹配

四、贪婪和非贪婪

在python中,默认是贪婪模式

# 与第三条形成对比
a = 'JavaScript3_2,php*7 %python32!@'
res = re.findall('[a-zA-Z]{3,10}?', a)
print(res)  # ['Jav', 'aSc', 'rip', 'php', 'pyt', 'hon']

另一个例子

# 贪婪模式(python中是默认贪婪模式)
s2 = 'abcabc'
res2 = re.findall('a.*c', s2)
print(res2)  # ['abcabc']

# 非贪婪模式(在匹配长度后边加上一个?)
s1 = 'abcabc'
res1 = re.findall('a.*?c', s1)
print(res1)  # ['abc', 'abc']

五、边界字符 匹配

# 边界匹配符
# ^   ---->从字符串开头开始匹配
# $   ---->以字符串末尾作为匹配结束

s4 = '100000001'
res8 = re.findall('\d{4,8}', s4)
res9 = re.findall('^001{4,8}', s4)
res10 = re.findall('100$', s4)
print(res8)  # ['10000000']默认是贪婪匹配
print(res9)  # []
print(res10)  # []

六、字符组合(组)的重复限制

s = 'PythonPythonPythonPythonPython'
res1 = re.findall('(Python){2}', s)
res2 = re.findall('Python{1,3}', s)
print(res1)  # ['Python', 'Python']
print(res2)  # ['Python', 'Python', 'Python', 'Python', 'Python']

七、findall()函数第三个参数讲解,匹配模式

re.I  # 忽略大小写

re.S  # 匹配所有的字符,包括换行符\n 会将.匹配上换行符\n

lan = 'PythonC#\nJavaPhp'
res1 = re.findall('c#', lan)
res2 = re.findall('c#', lan, re.I)
res3 = re.findall('c#.{1}', lan, re.I)
res4 = re.findall('c#.{1}', lan, re.I | re.S)  # 其实的 | 代表的且,不是或
print(res1)  # []
print(res2)  # ['C#']
print(res3)  # []
print(res4)  # ['C#\n']

八、re模块其他的函数

   1、sub()函数

s = 'PythonPhpC#JavaC#JavascriptC#'

# 替换函数sub( 正则表达式, 需要替换的内容, 原始字符串, [替换次数(默认为0表示全部替换)], [匹配模式(默认为0)] )
res1 = re.sub('C#', 'Go', s)
res2 = re.sub('C#', 'Go', s, 1)
print(res1)  # PythonPhpGoJavaGoJavascriptGo
print(res2)  # PythonPhpGoJavaC#JavascriptC#

# sub()第二个参数还可以是一个函数,匹配到多少次就调用该函数多少次
def convert(value):
    # print(value)
    # < _sre.SRE_Match object;span = (9, 11), match = 'C#' > 说明value是一个对象
    match = value.group()  # 使用group()取出sub()匹配到的字符串,即C#
    return '*%s*' % match

res3 = re.sub('C#', convert, s)
print(res3)  # PythonPhp*C#*Java*C#*Javascript*C#*

小例子

# 将大于等于6的数字转为9,将小于6的数字转为0
str1 = 'Abc872DE4F582gh'


def convert(value):
    match = value.group()
    if int(match) >= 6:
        return '9'
    else:
        return '0'


res = re.sub('\d', convert, str1)
print(res)
View Code

2、match()函数和search()函数

match()从字符串的开头 开始匹配,匹配到一个之后就停止

search()搜索的进行匹配,不一定是从第一个字符开始匹配,一样是匹配到一个之后就停止

s = '83C72D1D8E67'
res1 = re.match('\d', s)
print(res1.group())  # 8 匹配不到会抛出异常
res2 = re.search('\d', s)
print(res2.group())  # 8  匹配不到也会抛出异常

3.group()函数和groups()函数,是针对于组来说的

s = 'life is short, i use python yes'
res = re.search('life(.*)python(.*)', s)
print(res.group())  # life is short, i use python yes 默认取第一组,也就是原始字符串
print(res.group(0))  # life is short, i use python yes 组的下表从0开始,第一个就是原始字符串
print(res.group(1))  # is short, i use 取出第二组匹配到的字符串
print(res.group(2))  # yes   取出第三组匹配到的字符串
print(res.groups())  # (' is short, i use ', ' yes') 取出所有非原始字符串的所有组,结果是元组的形式

 

posted on 2018-09-06 15:58  冀念1002  阅读(280)  评论(0)    收藏  举报