python3_正则表达式

正则表达式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 匹配单词的边界, 匹配
\b ascii码表示退格

分组捕获

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.DOTALL make dot match all 单行模式
  • Multiline re.M, re.MULTILINE
  • IgnorePattern 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)     ^单行模式可能取到换行符

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)

猜你喜欢

转载自blog.csdn.net/qq_33287645/article/details/81384783