最近工作中经常用到正则表达式处理数据,慢慢发现了正则表达式的强大功能,尤其在数据处理工作中,记录下来分享给大家。

一、 正则表达式语法介绍

正则表达式(或 RE)指定了一组与之匹配的字符串;模块内的函数可以检查某个字符串是否与给定的正则表达式匹配(或者正则表达式是否匹配到字符串,这两种说法含义相同)。

正则表达式可以拼接;如果 A 和 B 都是正则表达式,则 AB 也是正则表达式。通常,如果字符串 p 匹配 A,并且另一个字符串 q 匹配 B,那么 pq 可以匹配 AB。
除非 A 或者 B 包含低优先级操作,A 和 B 存在边界条件;或者命名组引用。所以,复杂表达式可以很容易的从这里描述的简单源语表达式构建。

正则表达式可以包含普通或者特殊字符。绝大部分普通字符,比如 'A', 'a', 或者 '0',都是最简单的正则表达式。它们就匹配自身。
你可以拼接普通字符,所以 last 匹配字符串 'last'。通常正则表达式都会用到特殊字符匹配规则。

正则表达式,查找匹配字符串常用于以下几种场景:

1,去除匹配数据。
2,提取匹配数据。
3,替换匹配数据。
4,检测匹配数据。

二、 正则表达式常用方法
Python 基于正则表达式提供了不同的原始操作:
--这3个方法更多用于检测判断
re.match(pattern, string) 只在字符串的开头位置检测匹配。
re.search(pattern, string) 在字符串中的任何位置检测匹配。
re.fullmatch(pattern, string) 检测整个字符串是否匹配。

--这2个方法更多用于查找匹配数据,提取或替换获取目标结果数据。
re.findall(pattern, string) 在字符串中的任何位置检测匹配的字符并返回匹配的字符列表。
re.sub(pattern, repl, string) 在字符串中的任何位置匹配替换的字符并返回结果字符串。

print('============================')
rst1 = re.match("c", "abcdef") # No match
print(rst1)
rst2 = re.search("c", "abcdef") # Match
print(rst2)
# <re.Match object; span=(2, 3), match='c'>
rst3 = re.fullmatch("p.*n", "python") # Match
print(rst3)
# <re.Match object; span=(0, 6), match='python'>
rst4 = re.fullmatch("r.*n", "python") # No match
print(rst4)
rst5 = re.findall(r"\d+", "12pyt34hon56")
print(rst5)
# ['12', '34', '56']
rst6 = re.sub(r"\d+", "", "12pyt34hon56")
print(rst6)
# python
print('============================')

三、 正则表达式常用特殊字符
.
(点) 在默认模式,匹配除了换行的任意字符。如果指定了标签 DOTALL ,它将匹配包括换行符的任意字符。

print('============================')
# 全部替换成统一数据
str_list1 = ['万安县', '万方县', '万在县', '万义县']
for i in range(len(str_list1)):
# 匹配替换的字符
str_list1[i] = re.sub("万.县", "万安县", str_list1[i])
print(str_list1)
# ['万安县', '万安县', '万安县', '万安县']
print('============================')

^
(插入符号) 匹配字符串的开头, 并且在 MULTILINE 模式也匹配换行后的首个符号。

$
匹配字符串尾或者在字符串尾的换行符的前一个字符,在 MULTILINE 模式下也会匹配换行符之前的文本。
foo 匹配 'foo' 和 'foobar',但正则表达式 foo$ 只匹配 'foo'。
更有趣的是,在 'foo1\nfoo2\n' 中搜索 foo.$,通常匹配 'foo2',
但在 MULTILINE 模式下可以匹配到 'foo1';在 'foo\n' 中搜索 $ 会找到两个(空的)匹配:
一个在换行符之前,一个在字符串的末尾。

*
对它前面的正则式匹配0到任意次重复, 尽量多的匹配字符串。
ab* 会匹配 'a','ab',或者 'a' 后面跟随任意个 'b'。
ab* 会匹配 : 'a','ab','abb','abbb' 等等.

+
对它前面的正则式匹配1到任意次重复, 尽量多的匹配字符串。
ab+ 会匹配 'a' 后面跟随1个以上到任意个 'b',它不会匹配 'a'。
ab+ 会匹配 : 'ab','abb','abbb' 等等.

?
对它前面的正则式匹配0到1次重复。
ab? 会匹配 'a' 或者 'ab'。

\
转义特殊字符(允许你匹配 '*', '?', 或者此类其他),或者表示一个特殊序列.

print('============================')
# 保留数字 和 ¥数字 的金额格式数据,其他数据排除
str_list2 = ['5005', '200.85', '¥12450', '¥100.50', '张三', '2023.08.09']
get_list2 = []
for ss in str_list2:
# 查找匹配的字符,下面3个方法等价匹配
if re.search(r'(^¥?\d+\.?\d*$)', ss):
# if re.search(r'^¥?\d+\.?\d*$', ss):
# if re.fullmatch(r'¥?\d+\.?\d*', ss):
print('保留')
get_list2.append(ss)
else:
print('去除')
continue
print(get_list2)
# ['5005', '200.85', '¥12450', '¥100.50']
print('============================')

{m}
对其之前的正则式指定匹配 m 个重复;少于 m 的话就会导致匹配失败。
比如, a{6} 将匹配6个 'a' , 但是不能是5个。

{m,n}
对正则式进行 m 到 n 次匹配,在 m 和 n 之间取尽量多。
比如,a{3,5} 将匹配 3 到 5个 'a'。忽略 m 意为指定下界为0,忽略 n 指定上界为无限次。
比如,a{4,}b 将匹配 'aaaab' 或者1000个 'a' 尾随一个 'b',但不能匹配 'aaab'。
逗号不能省略,否则无法辨别修饰符应该忽略哪个边界。

print('============================')
# 保留8位带符号格式的日期数据,其他数据排除
str_list3 = ['2023年08月09日', '2023-08-09', '2023/08/09', '20230809', '2023/8/9']
get_list3 = []
for ss in str_list3:
# 查找匹配的字符,下面3个方法等价匹配
if re.search(r'[\d年月日]{11}', ss) or re.search(r'[\d\-\/]{9,10}', ss):
print('保留')
get_list3.append(ss)
else:
print('去除')
continue
print(get_list3)
# ['2023年08月09日', '2023-08-09', '2023/08/09']
print('============================')

[]
用于表示一个字符集合。在一个集合中:
1, 字符可以单独列出,比如 [amk] 匹配 'a', 'm', 或者 'k'。
2, 可以表示字符范围,通过用 '-' 将两个字符连起来。
比如 [a-z] 将匹配任何小写ASCII字符,
[0-9] 将匹配从 0到9 的1位数字,
[0-5][0-9] 将匹配从 00 到 59 的两位数字,
[0-9A-Fa-f] 将匹配任何十六进制数位。
如果-进行了转义(比如 [a\-z])或者它的位置在首位或者末尾(如 [-a] 或 [a-]),它就只表示普通字符 '-'。
3, 特殊字符在集合中会失去其特殊意义。比如 [(+*)] 只会匹配这几个字面字符之一 '(', '+', '*', or ')'。
4, 字符类如 \w 或者 \S (如下定义) 在集合内可以接受,它们可以匹配的字符由 ASCII 或者 LOCALE 模式决定。
5, 不在集合范围内的字符可以通过'取反'来进行匹配。
如果集合首字符是 '^' ,所有 不 在集合内的字符将会被匹配,
比如 [^5] 将匹配所有字符,除了 '5',
[^^] 将匹配所有字符,除了 '^'. ^ 如果不在集合首位,就没有特殊含义。
6, 要在集合内匹配一个 ']' 字面值,可以在它前面加上反斜杠,或是将它放到集合的开头。
例如,[()[\]{}] 和 []()[{}] 都可以匹配右方括号,以及左方括号,花括号和圆括号。

|
A|B, A 和 B 可以是任意正则表达式,创建一个正则表达式,匹配 A 或者 B. 任意个正则表达式可以用 '|' 连接。
它也可以在组合(见下列)内使用。扫描目标字符串时, '|' 分隔开的正则样式从左到右进行匹配。
当一个样式完全匹配时,这个分支就被接受。意思就是,一旦 A 匹配成功, B 就不再进行匹配,即便它能产生一个更好的匹配。
或者说,'|' 操作符绝不贪婪。 如果要匹配 '|' 字符,使用 \|, 或者把它包含在字符集里,比如 [|].

(...)
(组合),匹配括号内的任意正则表达式,并标识出组合的开始和结尾。
匹配完成后,组合的内容可以被获取,并可以在之后用 \number 转义序列进行再次匹配,之后进行详细说明。
要匹配字符 '(' 或者 ')', 用 \( 或 \), 或者把它们包含在字符集合里: [(], [)].

print('============================')
# 保留8位带符号格式的日期数据,其他数据排除
str_list3 = ['2023年08月09日', '2023-08-09', '2023/08/09', '20230809', '2023/8/9']
get_list3 = []
for ss in str_list3:
# 查找匹配的字符,下面3个方法等价匹配
if re.search(r'[\d年月日]{11}|[0-9\-\/]{9,10}', ss):
print('保留')
get_list3.append(ss)
else:
print('去除')
continue
print(get_list3)
# ['2023年08月09日', '2023-08-09', '2023/08/09'] print(re.search(r'(¥\d+)', '¥12450'))
# <re.Match object; span=(0, 6), match='¥12450'>
print('============================')

 

python正则表达式笔记1的更多相关文章

  1. python 正则表达式笔记

    #!usr/bin/env python3 #-*- coding:utf-8 -*- #正则表达式 #在正则表达式中,如果直接给出字符,就是精确匹配.用\d可以匹配一个数字,\w可以匹配一个字母.数 ...

  2. python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL

    python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...

  3. [Python学习笔记]正则表达式总结

    常用缩写字符及其含义表格查询 缩写字符分类 含义 \d 0-9的任意数字 \D 除0-9的数字以外的任何字符 \w 任何字母.数字或下划线字符(可以认为是匹配"单词"字符) \W ...

  4. Python 正则表达式学习笔记

    本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优化正则表达式,这些主题请查看其他教程 ...

  5. python学习笔记----正则表达式

    正则: regular expression 常用的场景: #正则的包 >>> import re #match:开头匹配,匹配到,返回一个匹配对象,否则返回None >> ...

  6. 7.Python 正则表达式学习笔记

    本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优化正则表达式,这些主题请查看其他教程 ...

  7. Python正则表达式 学习笔记

    python第一个正则表达式 1. import re : python正则表达式模块 2. 第一个正则表达式 re.compile(r'imooc') pattern.match('imooc py ...

  8. Python学习笔记:re模块(正则表达式)

    本文是部分内容参考自:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html,虽然这篇博客是基于Python2.4的老版本,但是基础的P ...

  9. Web Scraping with Python读书笔记及思考

    Web Scraping with Python读书笔记 标签(空格分隔): web scraping ,python 做数据抓取一定一定要明确:抓取\解析数据不是目的,目的是对数据的利用 一般的数据 ...

  10. [Python爬虫笔记][随意找个博客入门(一)]

    [Python爬虫笔记][随意找个博客入门(一)] 标签(空格分隔): Python 爬虫 2016年暑假 来源博客:挣脱不足与蒙昧 1.简单的爬取特定url的html代码 import urllib ...

随机推荐

  1. 关于Qt数据库相关开发的一些经验总结

    一.前言 近期花了两个多月时间,将数据库相关的代码重新封装成了各种轮子(这条路必须打通,打通以后,相关项目只需要引入这个组件pri即可),测试了从Qt4.7到Qt6.1的各种版本,测试了odbc.sq ...

  2. Qt音视频开发14-mpv读取和控制

    一.前言 用mpv来读取文件的信息,以及设置当前播放进度,音量.静音等,和当时vlc封装的功能一样,只不过vlc是通过调用函数接口去处理,而mpv是通过读取和设置属性来处理,vlc支持定时器或者线程中 ...

  3. 部署kubernetes-dashboard改成http免密登录

    原始链接地址 https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml 修改S ...

  4. 基于斜率-截距式参数方程的直线Hough变换

  5. 浅说c/c++ coroutine

    浅说c/c++ coroutine 从上面我们可以得到关于协程的几个关键信息, 1.打破传统(regular)函数调用的限制. 2.stackful协程实现方式,基于独立栈,上下文切换. 3.stac ...

  6. x86平台SIMD编程入门(5):提示与技巧

    1.提示与技巧 访问内存的成本非常高,一次缓存未命中可能会耗费100~300个周期.L3缓存加载需要40~50个周期,L2缓存大约需要10个周期,即使L1缓存的访问速度也明显慢于寄存器.所以要尽量保持 ...

  7. Windows bat批处理文件结束某个程序进程,删除文件夹

    Windows bat批处理文件结束某个程序进程,删除文件夹 bat文件内容: @echo off setlocal :: 要结束的应用程序进程名 set "PROCESS_NAME=助手. ...

  8. Docker npm install:npm ERR! code UNABLE_TO_GET_ISSUER_CERT_LOCALLY 。。reason: unable to get local issuer certificate 解决办法

    这个是需要证书导致无法连接,临时解决办法是设置 npm set strict-ssl=false 在 Dockerfile文件里的  RUN npm install 之前添加 RUN npm set ...

  9. 微服务实战系列(七)-网关springcloud gateway-copy

    1. 场景描述 springcloud刚推出的时候用的是netflix全家桶,路由用的zuul,但是据说zull1.0在大数据量访问的时候存在较大性能问题,2.0就没集成到springcloud中了, ...

  10. G1原理—10.如何优化G1中的FGC

    大纲 1.G1的FGC可以优化的点 2.一个bug导致的FGC(Kafka发送重试 + subList导致List越来越大) 3.为什么G1的FGC比ParNew + CMS要更严重 4.FGC的一些 ...