Python 正则处理_re模块

正则表达式

动机

  • 文本处理成为计算机常见工作之一
  • 对文本内容搜索,定位,提取是逻辑比较复杂的工作
  • 为了快速方便的解决上述问题,产生了正则表达式技术

定义

文本的高级匹配模式, 提供搜索, 替换, 本质由字符和特殊符号构成的字符串,

这个字符串即为正则表达式

匹配原理

通过普通字符和特殊含义的字符串, 来组成字符串,

用以描述一定的字符串规则, 比如重复, 位置, 来表达一种特定类型的字符串, 进而匹配

正则字符

通用

 0 - 9   匹配所有字符
 a - z   匹配所有小写字母
 A - Z   匹配所有大写字母
 A-Za-z  匹配所有字母

字符

.       换行符以外的任意
\w      数字, 字母, 下划线, 汉字    [a-z]
\s      空格
\d      数字  [0-9]
\b      单词边界    (数字,字母,下划线,汉字 与 其他字符交界位置)
\W      非 数字, 字母, 下划线, 汉字   [^a-z]
\S      非 空格
\D      非 数字    [^0-9]
\B      非 单词边界
\n      换行符
\t      制表符
^       开始位置
$       结束位置
|       或 (匹配上即不在匹配,需要 长的放在前面 例如 abc|ab )

量词

*       0~n次+       1~n次
?       0~1次
{n}     n次
{n,}    n或 n+次
{n,m}   n~m 次

字符集

[]      匹配字符组中的字符
[^]     匹配除了字符中的所有字符

分组

()      对整体进行 量词约束
(?:)    取消分组优先

(?P<name>pattern)      命名分组

 注意点

  • 一个正则中可以存在多个分组, 且分组可以嵌套
  • 作用前提是整体的表达式能被匹配到内容才可以
  • 未命名分组和命名分组是可以同时存在的, 未命名分组按照从外到内, 从左到右按照位置来用索引来命名
  • 分组不要重叠, 且最好不要嵌套, 倘若出现说明设计存在巨大缺陷

转义

\       被转义前加反斜线表示 匹配这一字符而不是用作正则表达式来处理
r''     python 对字符串的不转义需要 用 r 来表示, 减去书写的麻烦

 实例解析

# r""
# s = "\\hello"
# print(re.findall("\\\\\\w+", s))
# print(re.findall(r'\\\w+', s))

"""
python 字符串      --> 正则      --> 目标字符串
"\\$\\d+"           \$\d+           "$100"
r"\$\d+"            \$\d+           "$100"
* 为避免特殊字符串在字符串中使用时转义的麻烦, 使用 raw 字符串来表达正则表达式
"""

总结

匹配单个字符

. [] [^] \d \D \w \W \s \S

匹配重复

* + ? {n} {n,m}

匹配位置

^ $ \A \Z \b \B

其他

| () \

贪婪 / 非贪婪匹配

  • 默认 贪婪匹配 , 尽可能的往后匹配更多的内容
  • 加 ? 改为 非贪婪匹配, 懒惰模式, 满足条件后不往后匹配更多内容
  • 主要影响到的是重复匹配的操作符 * + ? {n} {n,m}
# 非贪婪匹配的运用
# s = "ashb, asjdlab, asdadb"
# print(re.findall(r"a.*b", s))   # ['ashb, asjdlab,asdadb']
# print(re.findall(r"a.*?b", s))  # ['ashb', 'asjdlab', 'asdadb']

匹配原则

  • 正确性     正确的匹配出目标字符串
  • 精准性     除了目标内容, 尽可能不要存在多余内容
  • 全面性     尽可能对目标字符串考虑全面, 做到不遗漏

Python re模块使用

compile

regex = compile(pattern,flags=0)

功能  生成正则表达式对象

参数

   pattern 正则表达式

扫描二维码关注公众号,回复: 5441452 查看本文章

  flags 功能标识,扩展正则匹配功能

返回值  正则对象

compile对象属性

  • flags : flags值
  • pattern : 正则表达式
  • groups : 子组数量
  • groupindex : 捕获组名与组序号的字典

findall

re.findall(pattern,string,flags=0)

功能  通过正则表达式匹配目标字符串内容

参数

  pattern 正则表达式

  string 目标字符串

返回值  

   返回匹配到的内容列表

    如果正则表达式存在 子组 则只返回 子组对应的内容

sub

re.sub(pattern,replace,string,max,flags=0)

功能  使用指定字符串替换正则表达式匹配内容

参数  

  pattern 正则

  replace 指定字符串

  string 目标字符串

  max 最多替换几处,默认全部替换

返回值  替换后的字符串

subn

re.subn() 

功能参数 同sub,

返回值 多一个实际替换个数

finditer

re.finditer(pattern,string,flags=0)

功能  使用正则表达式匹配目标内容

参数  

  pattern 正则

  string 目标字符串

返回值   迭代对象

fullmatch

re.fullmatch(pattern,string,flags=0)

功能  完全匹配某个目标字符串

参数  

  pattern 正则

  string 目标字符串

返回值  匹配内容match object

match

re.match(pattern,string,flags=0)

功能  匹配某个目标字符串开始位置

参数

  pattern 正则

  string 目标字符串

返回值  匹配内容match object

search

re.search(pattern,string,flags=0)

功能  匹配目标字符串第一个符合内容

参数  

  pattern 正则

  string 目标字符串

返回值  匹配内容match object

猜你喜欢

转载自www.cnblogs.com/shijieli/p/10485404.html
今日推荐