• Python正则表达式


    • [abc]匹配abc字符。会去文本中找对应的字符,并返回。
    import re
    
    text = '你好a, b, abc, asdff,'
    data_list = re.findall('[abc]', text)
    print(data_list) # ['a', 'b', 'a', 'b', 'c', 'a']
    
    • 1
    • 2
    • 3
    • 4
    • 5

    还可以与其他字符进行组合:

    import re
    
    text = '你好a, b, abc, 好asdff,'
    data_list = re.findall('好[abc]', text)
    print(data_list)  # ['好a', '好a']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • [^abc]匹配除了a、b、c以外的字符。
    import re
    
    text = '你好a, b, abc, 好asdff,'
    data_list = re.findall('[^abc]', text)
    print(data_list)  # ['你', '好', ',', ' ', ',', ' ', ',', ' ', '好', 's', 'd', 'f', 'f', ',']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • [a-z]匹配az之间的任意一个字符,[0-9]也可以
    import re
    
    text = 'trouble trend tank'
    data_list = re.findall('t[a-z]', text)
    print(data_list) # ['tr', 'tr', 'ta']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • .代指除换行符以外任意一个字符
    import re
    
    text = 'The Raiden Shogun is a playable Electro character in Genshin Impact.'
    data_list = re.findall('R.iden', text)  # 其中的 ‘.’ 只能代指一个字符
    print(data_list) # ['Raiden']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    import re
    
    text = 'The Raiden Shogun is a playable Electro character in Genshin Impact.'
    # 贪婪匹配
    data_list = re.findall('p.+a', text) # 其中的 ‘.+’ 中的‘+’表示‘.’代指的字符可以是一个或多个
    print(data_list) # ['playable Electro character in Genshin Impa']
    
    # 非贪婪匹配
    data_list = re.findall('p.+?a', text)
    print(data_list) # ['pla']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • \w匹配字母、数字、下划线或者汉字
    import re
    
    text = 'The Raiden Shogun (雷电将军) is a playable Electro character in Genshin Impact.'
    
    data_list = re.findall('雷电\w+', text)
    print(data_list) # ['雷电将军']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • \d 匹配数字
    import re
    
    text = 'log4j is a java jar'
    
    data_list = re.findall('log\d', text)
    print(data_list)  # ['log4']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • \s表示任意空白字符
    import re
    
    text = 'root admin add root'
    
    data_list = re.findall('a\w+\s', text)
    print(data_list) # ['admin ', 'add ']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • *表示前一个字符出现0次或多次
    import re
    
    text = 'root admin add admin'
    
    data_list = re.findall('ad*', text)
    print(data_list) # ['ad', 'add', 'ad']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • +表示前一个字符出现1次或多次
    import re
    
    text = 'abcccddddazzzz'
    
    data_list = re.findall('ab*', text)
    print(data_list) # ['ab', 'a']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • ?表示前面的字符出现0次或者1次
    import re
    
    text = '9527就是唐伯虎'
    
    data_list = re.findall('\d?就是', text)
    print(data_list) # ['7就是']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • {n}表示前面的字符出现n次
    import re
    
    text = '手机号码是13801239876'
    
    data_list = re.findall('138\d{4}', text)
    print(data_list) # ['1380123']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • {n,}表示前面的字符出现n次或者大于n次
    import re
    
    text = '手机号码是13801239876'
    
    data_list = re.findall('138\d{4,}', text) # 匹配138后面大于等于4位的数字
    print(data_list) # ['13801239876']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • {n,m}重复次数是从n次到m次
    import re
    
    text = '手机号码是13801239876'
    
    data_list = re.findall('138\d{4,5}', text)
    print(data_list) # ['13801239']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    上面都是按照整体去匹配,如何匹配部分数据呢,这里可以使用分组的概念:

    import re
    
    text = '金庸武侠小说中的人物有李秋水, 李沧海, 李莫愁, 段誉, 李三'
    
    data_list = re.findall('李\w{1,2}', text) # 全部提取出来
    print(data_list)  # ['李秋水', '李沧海', '李莫愁', '李三']
    
    data_list = re.findall('李(\w{1,2})', text) # 通过括号, 进行分组, 只提取出名
    print(data_list) # ['秋水', '沧海', '莫愁', '三']
    
    # 如果有多个括号进行分组
    data_list = re.findall('(李)(\w{1,2})', text) # 多个括号, 进行分组, 将会得到一个元组
    print(data_list) # [('李', '秋水'), ('李', '沧海'), ('李', '莫愁'), ('李', '三')]
    
    # 括号可以包含
    data_list = re.findall('(李(\w{1,2}))', text) 
    print(data_list) # [('李秋水', '秋水'), ('李沧海', '沧海'), ('李莫愁', '莫愁'), ('李三', '三')]
    
    
    # 分组可以或运算
    text = '唐伯虎进了华府, 变成了华安, 9527却不喜欢唐伯虎'
    data_list = re.findall('(华\w{1,2}|\d+)', text) 
    print(data_list) # ['华府', '华安', '9527']
    
    text = '110101199003073116'
    data_list = re.findall('(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9|X])', text) 
    print(data_list) # [('110101', '1990', '03', '07', '311', '6')]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • re.ASCII可以将中文排除
    import re
    
    text = '我的QQ邮箱是175638@qq.com谢谢'
    data_list = re.findall('\w+@\w+\.\w+', text)  # ['我的QQ邮箱是175638@qq.com谢谢']
    data_list = re.findall('\w+@\w+\.\w+', text, re.ASCII) # ['175638@qq.com']
    print(data_list)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    re模块

    • 上面我们用的都是findall函数,用来获取匹配到的所有数据
    • match,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None。这个方法主要用于判断一些用户输入的数据格式。
    import re
    
    text = '嘿嘿, 9527就是唐伯虎, 唐伯虎就是9527'
    data = re.match('\d+就是', text)
    print(data) # None, 因为字符串一开始并不是数字开头
    
    text = '9527就是唐伯虎, 唐伯虎就是9527'
    data = re.match('\d+就是', text)
    if data:
        content = data.group() # 如果匹配成功
        print(content) # 9527就是
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • search,不需要从起始位置匹配,只要文本中能匹配成功,就返回一个对象,未匹配成功返回None。
    import re
    
    text = '嘿嘿, 9527就是唐伯虎, 唐伯虎就是9527'
    data = re.search('\d+就是', text)
    if data:
        content = data.group()
        print(content) # 9527就是
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • sub,替换匹配成功的位置
    import re
    
    text = '嘿嘿, 9527就是唐伯虎, 唐伯虎就是9527'
    
    data = re.sub('\d+', '华安', text)
    print(data) # 嘿嘿, 华安就是唐伯虎, 唐伯虎就是华安
    
    # 只替换1个
    data = re.sub('\d+', '华安', text, 1)
    print(data)# 嘿嘿, 华安就是唐伯虎, 唐伯虎就是9527
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • split,根据匹配位置进行分割
    import re
    
    text = '嘿嘿, 9527就是唐伯虎, 唐伯虎就是9527'
    
    data = re.split('\d+', text)
    print(data) # ['嘿嘿, ', '就是唐伯虎, 唐伯虎就是', '']
    
    
    # 当然也可以指定匹配的个数
    data = re.split('\d+', text, 1)
    print(data) # ['嘿嘿, ', '就是唐伯虎, 唐伯虎就是9527']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • finditer,与findall不同的是,finditer返回的是一个迭代器,当匹配到的数据量很大时,这个方法可以节省内存。
    import re
    
    text = '嘿嘿, 9527就是唐伯虎, 唐伯虎就是9527'
    
    data = re.finditer('\d+', text)
    for item in data:
        print(item.group()) # 9527\n9527
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    此外finditer也可以对分组进行命名。通过?P<命名>来指定。

    import re
    
    text = '110101199003073116'
    
    data_list = re.finditer('\d{6}(?P\d{4})(?P\d{2})(?P\d{2})\d{3}([\d|X])', text) 
    for item in data_list:
        print(item.groupdict()) # {'year': '1990', 'month': '03', 'day': '07'}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    武汉市技术转移示范机构绩效考核对象、内容和申报流程、材料
    快速排序(c语言代码实现)
    【Day33】每日一题 [779. 第K个语法符号 ]
    pinctrl子系统 - pinctrl与gpio之间的耦合(六)
    SpringBoot+Vue实现excel导入带格式化的时间参数(moment格式化明天日期并设置el-date-picker默认值)
    【数据结构】——链表面试题详解
    任务需求分析中的流程图、用例图、er图、类图、时序图线段、图形的作用意义
    python使用opencv库对比两张图片并用红框标记出不同点
    post请求同时上传文件并传递其他参数的前后端写法
    解决MySQL大版本升级导致.Net(C#)程序连接报错问题
  • 原文地址:https://blog.csdn.net/vincent_duan/article/details/128083770