re/regex:正则表达式(持续更新ing...)

本文介绍Python中re/regex正则表达式相关内容。涵盖正则表达式语法,如点、星号等符号的匹配规则;re模块函数,像compile、findall等的功能;RegexFlag的作用;还给出典型任务示例,如查找特定内容、分句等,同时提及常见小bug及参考资料。
部署运行你感兴趣的模型镜像

诸神缄默不语-个人优快云博文目录

re包官方文档-英文版:re — Regular expression operations — Python 3.10.7 documentation
中文版:re — 正则表达式操作 — Python 3.10.7 文档

regex pypi官网:regex · PyPI

1. 正则表达式语法

  1. .:(点) 在默认模式,匹配除了换行的任意字符。如果指定了标签 DOTALL ,它将匹配包括换行符的任意字符。
  2. $:匹配字符串尾或者在字符串尾的换行符的前一个字符,在 MULTILINE 模式下也会匹配换行符之前的文本。
    foo 匹配 'foo''foobar',但正则表达式 foo$ 只匹配 'foo'
    'foo1\nfoo2\n' 中搜索 foo.$,通常匹配 'foo2',但在 MULTILINE 模式下可以匹配到 'foo1';在 'foo\n' 中搜索 $ 会找到两个(空的)匹配:一个在换行符之前,一个在字符串的末尾。
  3. *:对它前面的正则式匹配0到任意次重复, 尽量多的匹配字符串。 ab* 会匹配 aab,或者 a 后面跟随任意个 b
  4. ?:对它前面的正则式匹配0到1次重复。 ab? 会匹配 a 或者 ab
  5. +:对它前面的正则式匹配1至多次重复。\s+会匹配1至多个空白字符
  6. []:匹配括号内的任意字符
  7. |A|B A或B
  8. ^
    1. 在字符集中(即 [] 内):当 ^ 出现在字符集的第一个字符时,它表示“否定”或“排除”。例如,[^abc] 表示匹配除了 abc 之外的任何字符。
      示例: [^abc] 匹配任何不是 abc 的字符。
    2. 在字符集外:当 ^ 出现在正则表达式的开头时,它表示“行的开始”或“字符串的开始”。它用于匹配字符串的起始位置。
      示例:^abc 匹配以 abc 开头的字符串。
  9. (组合):匹配括号内的任意正则表达式
  10. \s
    1. 对于 Unicode (str) 样式:
      匹配任何Unicode空白字符(包括 [ \t\n\r\f\v] ,还有很多其他字符,比如不同语言排版规则约定的不换行空格)。如果 ASCII 被设置,就只匹配 [ \t\n\r\f\v] 。
    2. 对于8位(bytes)样式:
      匹配ASCII中的空白字符,就是 [ \t\n\r\f\v] 。
  11. \S:匹配任何非空白字符。就是 \s 取非。如果设置了 ASCII 标志,就相当于 [^ \t\n\r\f\v] 。
  12. \d
    1. 对于 Unicode (str) 样式:
      匹配任何Unicode十进制数(就是在Unicode字符目录[Nd]里的字符)。这包括了 [0-9] ,和很多其他的数字字符。如果设置了 ASCII 标志,就只匹配 [0-9] 。
    2. 对于8位(bytes)样式:
      匹配任何十进制数,就是 [0-9]。
  13. \w 任何字符

2. re模块函数

compile

re.compile(pattern):将正则表达式模式compile为正则表达式对象

escape

re.escape(pattern)

print(re.escape('https://www.python.org'))
https://www\.python\.org

legal_chars = string.ascii_lowercase + string.digits + "!#$%&'*+-.^_`|~:"
print('[%s]+' % re.escape(legal_chars))
[abcdefghijklmnopqrstuvwxyz0123456789!\#\$%\&'\*\+\-\.\^_`\|\~:]+

operators = ['+', '-', '*', '/', '**']
print('|'.join(map(re.escape, sorted(operators, reverse=True))))
/|\-|\+|\*\*|\*

这个函数根据Python编译器的版本,差别还挺大的:
在这里插入图片描述

findall

re.findall(pattern,string)

finditer

re.finditer(pattern,string):找到所有匹配的位置
返回值是一个迭代器,每个元素是一个Match对象,其span()的第一个元素是匹配位置的索引

sub

re.sub(pattern, 替换后的字符串, string):替换字符串

示例代码,将单一数字替换为*

import re
 
s = "您好,欢迎来到我的博客:https://blog.youkuaiyun.com/weixin_44799217,,,###,,,我的邮箱是:535646343@qq.com. Today is 2021/12/21. It is a wonderful DAY!"
 
#  只匹配单一数字
ret = re.sub(r'[0-9]', "*", s)
print(ret)

在这里插入图片描述

split

re.split('[,,]',string):使用多种标点符号同时分割句子,返回分割后的字符串列表

search

re.search(pattern, string, flags=0):查找pattern第一次出现的位置。如果没有,返回None

pattern的函数

match

title_pattern = re.compile(r'^\s*#\s')
title_pattern.match(line)  #一个布尔表达式

3. RegexFlag

就是写在re函数里面的,可以见本文第4节的例子作为参考。

  1. re.DOTALL:如果不用这个flag的话,.是无法匹配到换行符的
  2. re.IGNORECASE:大小写不敏感1

4. 典型任务示例

  1. 打印字符串中找obj1obj2之间的内容:re.findall(r'obj1(.*?)obj2',被查找的字符串,re.DOTALL)
  2. 将字符串按照回车和句号进行分句(不会保留回车和句号):re.split('[。\n]',字符串)
  3. 字符串是否匹配指定pattern:re.match(r'pattern',字符串,re.DOTALL)
  4. 匹配任何中文字符,简单写法:[\u4e00-\u9fff]
    (基本汉字到9FA5,补充字到9FFF。一般用9FA5也够了)
    示例代码:
    import re
    pattern = r'[\u4e00-\u9fff]+'  # 匹配连续汉字
    text = "你好,Hello!"
    print(re.findall(pattern, text))  # 输出:['你好']
    
    一个很高级的写法(包括更多格式的中文字符):[\u3006\u3007\u4e00-\u9fff\u3400-\u4dbf\U00020000-\U0002a6df\U0002a700-\U0002ebef\U00030000-\U0003134f](……没看懂但是总之可以参考:https://ayaka.shn.hk/hanregex/zh-CN/
    用第三方库regex还可以用Unicode属性来实现,不过见上帖,说是并不推荐使用这种写法:
    import regex
    pattern = r'\p{Script=Han}+'
    text = "汉字测试 Test"
    print(regex.findall(pattern, text))  # 输出:['汉字测试']
    
  5. 字符串是否匹配数字(包括0-9阿拉伯数字,零-十大小写中文数字):
    pattern=re.compile(r'[0-9零一二三四五六七八九十〇壹贰叁肆伍陆柒捌玖拾]')
    pattern.search(string_object)
    
  6. 从字符串中抽取所有数字:
    def extract_numbers(s):
    	return re.findall(r'\d+(?:\.\d+)?', s)  #注意对于英文,建议用\b\d+(?:\.\d+)?\b  \b保证数字独立
    
  7. 删除文本中的标点符号:
    simple_punctuation = '[’!"#$%&\'()*+,-/:;<=>?@[\\]^_`{|}~,。,]'
    line = re.sub(simple_punctuation, '', linee)
    
  8. 删除文本中的数字:re.sub("[0-9]", " ", line)
  9. 从文本中抽取URL
    import re
    url_pattern=re.compile(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+')
    official_sites=re.findall(url_pattern,'ASPLOS会议的官网是https://www.asplos-conference.org/,2023年论文提交截止时间是2022年10月20日。')
    

5. 常见小bug

  1. re.error: multiple repeat
    错误原因:内容里有特殊字符
    解决方案:re.escape(pattern)2

6. 本文撰写过程中参考的资料

  1. Python 截取两个字符串之间的内容_python截取两个字符串之间的内容_琪琪%¥%的博客-优快云博客
  2. re.sub()用法详解-优快云博客
  3. 还没看
    1. https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md

  1. re.IGNORECASE | Interactive Chaos ↩︎

  2. re.error: multiple repeat 解决方法 - 布都御魂 - 博客园 ↩︎

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诸神缄默不语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值