domain specific language (DSL) 特点领域的语言
匹配规则: 从左往右读取,匹配到加入结果,继续向后,不会回头
用于文本处理,匹配替换
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
匹配单词的边界, 匹配
\b
ascii码表示退格
pattern | match |
---|---|
(pattern) | 分组 |
(?:pattern) | 只取消分组号 |
(? |
命名分组 |
(?’name’pattern) | 命名分组 |
\n | n表示分组组号,从1开始, 使用前面匹配到的分组内容 |
pattern | match |
---|---|
(?<=pattern) |
零宽断言(即条件语句), 左侧满足 |
(?=pattern) | 右侧满足 |
(? |
左侧不满足 |
(?!pattern) | 右侧不满足 |
(?#comment) | 注释 |
re.I
, re.IGNORECASE
re.S
, re.DOTALL
make dot match all 单行模式re.M
, re.MULTILINE
re.X
, re.VERBOSE
pattern表达式忽略空白字符, 如果要使用空白字符用转义字符单行模式中,.可以匹配所有字符
多行模式中,.可以匹配换行符除以外的所有字符
| 符号可以同时开启多个引擎
\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) ^单行模式可能取到换行符
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为最大
matchobj.group(N) 返回1-N对应的分组字符串
matchobj.group(0) 返回整个匹配字符串
matchobj.groups() 返回所有分组字符串,tuple
matchobj.groupdict() 返回所有命名分组
match.start() 匹配的起始索引
match.end() 匹配的结束索引
match.span() match对象匹配到的字符串的index区间(start, end)