正则表达式Regular Expression
domain specific language (DSL) 特点领域的语言
匹配规则: 从左往右读取,匹配到加入结果,继续向后,不会回头
用于文本处理,匹配替换
基本语法
元字符matecharacter
| pattern | mach |
|---|---|
| . | 匹配任意单个字符,多行模式不包含换行符 |
| [abc] | 字符集中任意一个字符, |
| [^abc] | 非字符集中的任意字符,可能取到换行符,其他特殊字符在字符集中表示其本意,如$,^只在开头表示取反 |
| [0-9][a-zA-Z] | 字符范围构成的集合,任意一个 |
| \b | 单词的边界, \w和\W之间的空字符或\w和(头或尾)部之间的空字符,\b与ascii码退格\b重复, pattern加r |
| \B | 相邻\w或符号之间的空字符 |
| \A | str的开头 |
| \Z | str的结尾 |
| \d | [0-9] |
| \D | [^0-9] |
| \s | 空白字符空格[\t\n\r\v\f], whitespace |
| \S | 非空白字符 |
| \w | [a-zA-Z0-9_中文字符] |
| \W | 空白字符, 标点等 |
| x | y |
| ^ | 整体或行的开始: \n后面字符 |
| $ | 整行的结束: \n前的字符,\r换行会影响匹配 |
重复
| pattern | match |
|---|---|
| * | 0次或多次 |
| + | 至少一次 |
| ? | 0次或一次 |
| {n} | n次 |
| {n,} | n-无穷次 |
| {,m} | 0-m次 |
| {n,m} | n-m次 |
贪婪与非贪婪:
默认为贪婪模式(尽可能多匹配重复),加?变为非贪婪模式(尽可能少匹配重复)
*? | +?
?? | {n,}?
{n,m}?
转义
当需要使用元字符本意时加\转义
ascii码转义先于正则的转义
pattern(str)前面加上‘r’, 是为了告诉编译器这个string是个raw string,不要转意backslash ‘\’ 。 例如,\n 在raw string中,是两个字符,\和n, 而不会转意为换行符。由于正则表达式和 \ 会有冲突,因此,当一个字符串作为正则表达式使用时,最好在前面加上’r’, 例:
re.match('\\\\b','\\b')
re.match(r'\\b','\\b')
\b匹配单词的边界, 匹配
\bascii码表示退格
分组捕获
| pattern | match |
|---|---|
| (pattern) | 分组 |
| (?:pattern) | 只取消分组号 |
(?<name>pattern) | 命名分组 |
| (?’name’pattern) | 命名分组 |
| \n | n表示分组组号,从1开始, 使用前面匹配到的分组内容 |
断言
| pattern | match |
|---|---|
(?<=pattern) | 零宽断言(即条件语句), 左侧满足 |
| (?=pattern) | 右侧满足 |
(?<!pattern) | 左侧不满足 |
| (?!pattern) | 右侧不满足 |
| (?#comment) | 注释 |
引擎选项
- IgnoreCase
re.I,re.IGNORECASE - Singleline
re.S,re.DOTALLmake dot match all 单行模式 - Multiline
re.M,re.MULTILINE - IgnorePattern
re.X,re.VERBOSEpattern表达式忽略空白字符, 如果要使用空白字符用转义字符
单行模式中,.可以匹配所有字符
多行模式中,.可以匹配换行符除以外的所有字符
| 符号可以同时开启多个引擎
例子
\d 1位数
[1-9]\d 2位数
^([1-9]\d?\d|\d) 3位数
ip地址
([0-2]?\d?\d\.){3}[0-2]?\d?\d
(([1-2]\d\d?|\d)\.){3}([1-2]\d\d?|\d) 299.259.259.259
((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d?)\.){3}(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d?)
url捕获文件名
.*ftp.*/(.*(?:gz|xz)) 贪婪模式使用
(?<=.*ftp.*)[^/]*?\.(gz|xz) ^单行模式可能取到换行符
re库
编译
regex = re.compile(pattern, flags=0) 编译pattern对象
单次匹配
re.match(pattern, string, flags=0) flags: re.I;re.M;re.X;re.S
regex.match(string[, pos[, endpos]])
re.search(pattern, string, flags=0)
regex.search(string[, pos[, endpos]])
re.fullmatch(pattern, string, flag=0)
regex.fullmatch(string[, pos[, endpos]])
全文匹配
re.findall(pattern, string, flags=0) -> list
regex.findall(string[, pos[, endpos]])
返回所有匹配项分组的列表,如果匹配项中有两个及以上分组,则以列表套元组形式返回
re.finditer(pattern, stirng, flags=0)
regex.finditer(string[, pos[, endpos]]) ->iterable(match obj),迭代器,一次迭代,
替换
re.sub(pattern, replacement, string, count=0, flags=0) -> str
regex.sub(replacement, string, count=0) -> str
返回替换后的字符串
所有匹配到的matcher依此替换,count指定替换次数,默认0表示最大,count如果大于匹配次数,以最大匹配次数替换
replacement可以是用作替换的字符串,也可以是callable,将接收匹配到match对象,并返回用作替换的字符串
re.subn(pattern, replacement, string, count=0, flags=0) -> (str, n)
regex.subn(replacement, string, count=0) -> tuple(new_string, number_os_subs_made) -> (str, n)
同上,n表示替换完成次数
分割
re.split(pattern, string, maxsplit=0, flags=0)
regex.split(string, maxsplit)
maxsplit指定最大分割,大于可匹配到的分隔符次数,以最大次数分割,0为最大
match 对象的分组
matchobj.group(N) 返回1-N对应的分组字符串
matchobj.group(0) 返回整个匹配字符串
matchobj.groups() 返回所有分组字符串,tuple
matchobj.groupdict() 返回所有命名分组
match.start() 匹配的起始索引
match.end() 匹配的结束索引
match.span() match对象匹配到的字符串的index区间(start, end)

本文详细介绍了正则表达式的语法及应用,包括元字符、重复、分组捕获等概念,并提供了丰富的实例演示如何进行文本匹配与处理。
603

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



