正则表达式
1、正则表达式
通过设定有特殊意义的符号,描述符号和字符的重复行为及位置特征来表示一类特定规则的字符串
2、正则表达式的匹配原则
【1】正确性
能够正确匹配目标字符串
【2】唯一性
除了匹配的目标内容,尽可能不会有不需要的内容
【3】全面性
对目标字符串可能的情况要考虑全面不漏
3、re模块
处理正则表达式
4、原始字符串
https://www.cnblogs.com/longyuu/p/14276219.html
5、正则表达式符号
6、贪婪和非贪婪
【1】贪婪模式
正则表达式的重复匹配,总是尽可能多的向后匹配内容。
【2】非贪婪(懒惰)模式
尽可能少的匹配内容
In [10]: re.findall(r"ab*?",'abbbbbbbbbb') Out[10]: ['a'] In [11]: re.findall(r"ab+?",'abbbbbbbbbb') Out[11]: ['ab'] In [12]: re.findall(r"ab??",'abbbbbbbbbb') Out[12]: ['a'] In [13]: re.findall(r"ab{2,5}?",'abbbbbbbbbb') Out[13]: ['abb'] In [14]: re.findall(r"ab{1,5}?",'abbbbbbbbbb') Out[14]: ['ab'] In [15]: re.findall(r"ab{3,5}?",'abbbbbbbbbb') Out[15]: ['abbb'] In [16]: re.findall(r"ab{3,5}",'abbbbbbbbbb') Out[16]: ['abbbbb'] In [17]: re.findall("ab{3,5}",'abbbbbbbbbb') Out[17]: ['abbbbb'] In [18]: re.findall("ab{3,5}",'ab abbb abbbbbbbbbb') Out[18]: ['abbb', 'abbbbb'] In [19]: re.findall("ab{3,5}",'ab abbb abbbbabbbbb') Out[19]: ['abbb', 'abbbb', 'abbbbb']
正则表达式分组
1、子组
使用()可以为正则表达式建立子组,子组不会影响正则表达式整体的匹配内容,可以被看做是一个内部单元。
【1】子组的作用:
① 形成内部整体,该表某些元字符的行为
In [28]: re.search(r"(ab)+",'abababab').group() Out[28]: 'abababab'
② 子组匹配内容可以被单独获取
In [29]: re.search(r"\w+@\w+\.(com|cn)",'axs@zhongguo.cn').group() Out[29]: 'axs@zhongguo.cn' In [30]: re.search(r"\w+@\w+\.(com|cn)",'axs@zhongguo.cn').group(0) Out[30]: 'axs@zhongguo.cn' In [31]: re.search(r"\w+@\w+\.(com|cn)",'axs@zhongguo.cn').group(1) Out[31]: 'cn'
In [33]: re.search(r"(ab)+",'abababab').group() Out[33]: 'abababab' In [34]: re.search(r"(ab)+",'abababab').group(0) Out[34]: 'abababab' In [35]: re.search(r"(ab)+",'abababab').group(1) Out[35]: 'ab'
【2】子组注意事项
① 一个正则表达式中可以有多个子组,区分第一,第二。。。子组
② 子组不要出现重叠的情况,尽量简单
2、捕获组和非捕获组 (命令组,未命名组)
格式 : (?P<name>pattern)
In [36]: re.search(r"(?P<dog>ab)+",'abababab').group() Out[36]: 'abababab'
【作用】 ① 方便通过名字区分每个子组
② 捕获组可以重复调用
【格式】(?P=name)
e.g:(?P<dog>ab)cd(?P=dog) ===> abcdab
In [41]: re.search(r"(?P<dog>ab)cdef(?P=dog)",'abcdefab').group() Out[41]: 'abcdefab'