1.模块re
- 以一定规则,快速检索文本,或是实现一些替换操作
- 默认下,区分大小写
2.常见的匹配字符表
字符 |
描述 |
\d |
代表任意数字,就是阿拉伯数字 0-9 这些 |
\D |
代表非数字的字符。与\d完全相反 |
\w |
代表字母,数字,下划线。也就是 a-z、A-Z、0-9、_ |
\W |
跟 \w 相反 ,代表不是字母,不是数字,不是下划线的字符。 |
\n |
代表一个换行。 |
\r |
代表一个回车。 |
\f |
代表换页。 |
\t |
代表一个 Tab 。 |
\s |
代表所有的空白字符,也就是上面这四个:\n、\r、\t、\f。 |
\S |
跟 \s 相反,代表所有不是空白的字符。 |
\A |
代表字符串的开始。 |
\Z |
代表字符串的结束。 |
^ |
匹配字符串开始的位置。 |
$ |
匹配字符创结束的位置。 |
. |
代表所有的单个字符,除了 \n \r |
[...] |
代表在 [] 范围内的字符,比如 [a-z] 就代表 a到z的字母 |
[^...] |
跟 [...] 唱反调,代表不在 [] 范围内的字符 |
{n} |
匹配在 {n} 前面的东西,比如: o{2} 不能匹配 Bob 中的 o ,但是能匹配 food 中的两个o。 |
{n,m} |
匹配在 {n,m} 前面的东西,比如:o{1,3} 将匹配fooooood 中的前三个o。 |
{n,} |
匹配在 {n,} 前面的东西,比如:o{2,} 不能匹配“Bob”中的“o”,但能匹配fooooood 中的所有o。 |
* |
和 {0,} 一个样,匹配 * 前面的 0 次或多次。 比如 zo* 能匹配“z”、“zo”以及“zoo”。 |
+ |
和{1,} 一个样,匹配 + 前面 1 次或多次。 比如 zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。 |
? |
和{0,1} 一个样,匹配 ?前面 0 次或 1 次。 |
a|b |
匹配 a 或者 b。 |
() |
匹配括号里面的内容。 |
| a = 'C|C++|C#|Python|Java' |
| |
| print(a.index('Python')>-1) |
| print('Python' in a) |
| |
| import re |
| |
| re.findall('Python', a) |
| print(re.findall("Python", a)) |
| |
2.1/d /D
| import re |
| a = 'C0C++1C#2Python3Java' |
| |
| r = re.findall('\d', a) |
| print(r) |
| |
| r = re.findall('\D', a) |
| print(r) |
| |
2.2[]
表示或
| |
| import re |
| s = 'abc, acc, adc, aec, afc, ahc' |
| r = re.findall('a[cf]c', s) |
| print(r) |
| |
| |
| r = re.findall('a[^cf]c', s) |
| print(r) |
| |
| |
| r = re.findall('a[c-f]c', s) |
| print(r) |
2.3\w \W
| |
| |
| import re |
| a = 'C0C++\n1C# 2Python3*Java_' |
| |
| r = re.findall('\w', a) |
| print(r) |
| |
| |
| r = re.findall('\W', a) |
| print(r) |
| |
| |
| r = re.findall('\s', a) |
| print(r) |
2.4{}
表示匹配次数
| |
| |
| import re |
| a = 'python 11 java 22 php' |
| r = re.findall('[a-z]{3}', a) |
| print(r) |
| |
| |
| r = re.findall('[a-z]{3,6}', a) |
| print(r) |
2.5贪婪 非贪婪
| |
| |
| |
| r = re.findall('[a-z]{3,6}?', a) |
| print(r) |
2.6*
+
| |
| a = 'pytho0python1pythonn2' |
| r = re.findall('python*', a) |
| print(r) |
| |
| r = re.findall('pytho*', a) |
| print(r) |
| |
| r = re.findall('pythonn*', a) |
| print(r) |
| |
| |
| import re |
| r = re.findall('python+', a) |
| print(r) |
| |
| |
| r = re.findall('python{1,2}', a) |
| print(r) |
| |
| |
| r = re.findall('python{1,2}?', a) |
| print(r) |
2.7^ $
边界符
| |
| import re |
| qq = '1000001' |
| |
| r = re.findall('\d{4,8}', qq) |
| print(r) |
| |
| qq = '10000000001' |
| r = re.findall('\d{4,8}', qq) |
| print(r) |
| |
| |
| |
| |
| r = re.findall('^\d{4,8}$', qq) |
| print(r) |
| |
| r = re.findall('^0000', qq) |
| print(r) |
2.8()
分组
| |
| import re |
| a = 'pythonpythonpythonJs' |
| |
| r = re.findall('(python){3}(JS)', a) |
| print(r) |
| |
| |
| r = re.findall('(python)(JS)', a, re.I) |
| print(r) |
| |
| |
| r = re.findall('(python)(JS)', a, re.I | re.S) |
| print(r) |
2.9.
匹配除换行符\n 以外的其他所有字符
| |
| a = 'python\nCC' |
| r = re.findall('python.', a, re.I) |
| print(r) |
| |
| r = re.findall('python.', a, re.S) |
| print(r) |
2.10re.sub
替换操作
| |
| import re |
| language = 'PythonC#JavaC#PHPC#' |
| r = re.sub('C#', 'GO', language) |
| print(r) |
| |
| r = re.sub('C#', 'GO', language, 1) |
| print(r) |
| |
| r = re.sub('C#', 'GO', language, 0) |
| print(r) |
| |
| |
| def convert(value): |
| pass |
| r = re.sub('C#', convert, language) |
| print(r) |
| |
| |
| def conver(value): |
| matched = value.group() |
| return '!!' + matched + '!!' |
| |
| r = re.sub('C#', convert, language) |
| print(r) |
2.11将函数作为参数
| |
| import re |
| s = 'ABC37978D432' |
| |
| def convert(value): |
| |
| matched = value.group() |
| if matched >= 6: |
| return 9 |
| else: |
| return 0 |
| |
| r = re.sub('\d', convert, s) |
| print(r) |
2.12re.match re.search
| |
| |
| |
| import re |
| s = 'ABC37978D432' |
| |
| r = re.match('\d', s) |
| print(r) |
| r = re.search('\d', s) |
| print(r) |
| print(r.group()) |
| print(r.span()) |
2.13group 分组
| |
| |
| import re |
| s = 'life is short, i use python' |
| |
| r = re.search('life.*python', s) |
| print(r.group()) |
| |
| |
| r = re.search('(life.*python)', s) |
| print(r.group(0)) |
| |
| |
| r = re.search('life(.*)python', s) |
| print(r.group(1)) |
| |
| r = re.findall('life(.*)python', s) |
| print(r) |
| |
| s = 'life is short, i use python, i love python' |
| r = re.search('life(.*)python(.*)python', s) |
| print(r.group(0)) |
| print(r.group(1)) |
| print(r.group(2)) |
| print(r.group(0,1,2)) |
| print(r.groups()) |
| |
一些例子
| 正则表达式 |
| |
| import re |
| |
| line = 'booooooooobbby123' |
| r = re.match(".*(b.*b).*", line) |
| print(r.group(1)) |
| print(r.group(0)) |
| |
| r = re.match(".*?(b.*?b).*", line) |
| print(r.group(1)) |
| |
| |
| print('~+~~~~~~~~~') |
| r = re.match(".*(b.+b)", line) |
| print(r.group(1)) |
| |
| |
| print('|||||') |
| r = re.match(".*(bbb|bby123)", line) |
| print(r.group(1)) |
| |
| print('|||||') |
| r = re.match(".*(bby123|bbb)", line) |
| print(r.group(1)) |
| |
| line2 = '15541861937' |
| regex_str = "(1[2345][0-9]{3})" |
| r = re.match(regex_str, line2) |
| print(r.group(0)) |
| |
| |
| print('[\u4E00-\u9FA5]+~~~~~~~~~~~~~~~~~~~~~') |
| line = '你好吗' |
| r = re.match("[\u4E00-\u9FA5]+", line) |
| print(r.group(0)) |
| |
| print('[\u4E00-\u9FA5]+~~~~~~~~~~~~~~~~~~~~~') |
| line = '你 好吗' |
| r = re.match("[\u4E00-\u9FA5]+", line) |
| print(r.group(0)) |
| |
| print('[\u4E00-\u9FA5]+~~~~~~~~~~~~~~~~~~~~~') |
| line = 'study in 北京大学' |
| r = re.match(".*([\u4E00-\u9FA5]+大学)", line) |
| print(r.group(1)) |
| |
| print('[\u4E00-\u9FA5]+~~~~~~~~~~~~~~~~~~~~~') |
| line = 'study in 北京大学' |
| r = re.match(".*?([\u4E00-\u9FA5]+大学)", line) |
| print(r.group(1)) |
| |
| |
| line = 'XXX出生于2001年6月' |
| line = 'XXX出生于2001/6/1' |
| line = 'XXX出生于2001-6-1' |
| line = 'XXX出生于2001-06-01' |
| line = 'XXX出生于2001-06' |
| |
| regex_str = ".*出生于(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}|[月/-]$|$))" |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步