re包官方文档-英文版:re — Regular expression operations — Python 3.10.7 documentation
中文版:re — 正则表达式操作 — Python 3.10.7 文档
regex pypi官网:regex · PyPI
文章目录
1. 正则表达式语法
.:(点) 在默认模式,匹配除了换行的任意字符。如果指定了标签 DOTALL ,它将匹配包括换行符的任意字符。$:匹配字符串尾或者在字符串尾的换行符的前一个字符,在 MULTILINE 模式下也会匹配换行符之前的文本。
foo匹配'foo'和'foobar',但正则表达式foo$只匹配'foo'。
在'foo1\nfoo2\n'中搜索foo.$,通常匹配'foo2',但在 MULTILINE 模式下可以匹配到'foo1';在'foo\n'中搜索$会找到两个(空的)匹配:一个在换行符之前,一个在字符串的末尾。*:对它前面的正则式匹配0到任意次重复, 尽量多的匹配字符串。ab*会匹配a,ab,或者a后面跟随任意个b。?:对它前面的正则式匹配0到1次重复。ab?会匹配a或者ab。+:对它前面的正则式匹配1至多次重复。\s+会匹配1至多个空白字符[]:匹配括号内的任意字符|:A|BA或B^- 在字符集中(即
[]内):当^出现在字符集的第一个字符时,它表示“否定”或“排除”。例如,[^abc]表示匹配除了a、b或c之外的任何字符。
示例:[^abc]匹配任何不是a、b或c的字符。 - 在字符集外:当
^出现在正则表达式的开头时,它表示“行的开始”或“字符串的开始”。它用于匹配字符串的起始位置。
示例:^abc匹配以abc开头的字符串。
- 在字符集中(即
(组合):匹配括号内的任意正则表达式\s- 对于 Unicode (str) 样式:
匹配任何Unicode空白字符(包括 [ \t\n\r\f\v] ,还有很多其他字符,比如不同语言排版规则约定的不换行空格)。如果 ASCII 被设置,就只匹配 [ \t\n\r\f\v] 。 - 对于8位(bytes)样式:
匹配ASCII中的空白字符,就是 [ \t\n\r\f\v] 。
- 对于 Unicode (str) 样式:
\S:匹配任何非空白字符。就是 \s 取非。如果设置了 ASCII 标志,就相当于 [^ \t\n\r\f\v] 。\d- 对于 Unicode (str) 样式:
匹配任何Unicode十进制数(就是在Unicode字符目录[Nd]里的字符)。这包括了 [0-9] ,和很多其他的数字字符。如果设置了 ASCII 标志,就只匹配 [0-9] 。 - 对于8位(bytes)样式:
匹配任何十进制数,就是 [0-9]。
- 对于 Unicode (str) 样式:
\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节的例子作为参考。
re.DOTALL:如果不用这个flag的话,.是无法匹配到换行符的re.IGNORECASE:大小写不敏感1
4. 典型任务示例
- 打印字符串中找
obj1和obj2之间的内容:re.findall(r'obj1(.*?)obj2',被查找的字符串,re.DOTALL) - 将字符串按照回车和句号进行分句(不会保留回车和句号):
re.split('[。\n]',字符串) - 字符串是否匹配指定pattern:
re.match(r'pattern',字符串,re.DOTALL) - 匹配任何中文字符,简单写法:
[\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)) # 输出:['汉字测试'] - 字符串是否匹配数字(包括0-9阿拉伯数字,零-十大小写中文数字):
pattern=re.compile(r'[0-9零一二三四五六七八九十〇壹贰叁肆伍陆柒捌玖拾]') pattern.search(string_object) - 从字符串中抽取所有数字:
def extract_numbers(s): return re.findall(r'\d+(?:\.\d+)?', s) #注意对于英文,建议用\b\d+(?:\.\d+)?\b \b保证数字独立 - 删除文本中的标点符号:
simple_punctuation = '[’!"#$%&\'()*+,-/:;<=>?@[\\]^_`{|}~,。,]' line = re.sub(simple_punctuation, '', linee) - 删除文本中的数字:
re.sub("[0-9]", " ", line) - 从文本中抽取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
re.error: multiple repeat
错误原因:内容里有特殊字符
解决方案:re.escape(pattern)2
本文介绍Python中re/regex正则表达式相关内容。涵盖正则表达式语法,如点、星号等符号的匹配规则;re模块函数,像compile、findall等的功能;RegexFlag的作用;还给出典型任务示例,如查找特定内容、分句等,同时提及常见小bug及参考资料。
4170

被折叠的 条评论
为什么被折叠?



