lnlidawei

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

【python3】 【regular expression】笔记

 

 

 

 

一、笔记内容

 

【问题】:	python3	-	【regular expression】 笔记




【回答】


	1、	【re.MULTILINE】	模式:		
		--	[^$]从匹配字符串,扩展到匹配‘行’的首位。
		--	即[^$]从匹配“字符串”,扩展到匹配“行”。
		
		--	“行”,以“newline(\n)”结尾标志的计量单位。
		--	“行【\n】”的结尾标识符,既是“一个行”的结尾位置;也是“另一个行(下位相邻的行)”的开始位置。
			--	“[\n]”示例:	"abcd\nefgh":
				--	d:	是第一个行的结尾位置;
				--	e:	是下位相邻行的开始位置;
		
	
	2、	回溯:	
			--	第一次匹配失败后;调整pattern中选择,重新匹配。
			--	允许匹配两次;允许“被匹配的字符串”第二次匹配pattern.
		不能回溯:
			--	当pattern匹配失败后,直接结束本次匹配。
			--	只有一次匹配机会;	无论pattern是否涉及“重复次数”。

		
	3、	贪婪:
			--	贪婪模式:	--	涉及“重复次数”的pattern时,在匹配成功的前提下,尽可能匹配到“被匹配的字符串中”到最长的“子字符串”。
						--	在匹配成功的前提下,在涉及“重复次数”的pattern中,匹配“被匹配字符串中最长的子字符串”。
						--	pattern,在“被匹配的字符串中”,匹配到“最长子字串”。
	
	
	4、	(*/+/?)【?+】
	
			--	回溯:		第一次匹配失败;	通过调整pattern中的次数,再次匹配“被匹配的字符串”; 两次匹配。
				--	当“pattern”匹配到“被匹配字符串str1”的末尾时,发现匹配失败;
						然后通过调整(减少)被匹配字符串(str1)中字符的数量,来重新适配“pattern”规则。
				--	回溯:		当匹配失败后;通过调整被匹配字符串的字符数量,来重新适配“pattern”;允许二次匹配。
				--	回溯的本质:	进行两次匹配;	允许进行第二次匹配。
						
			--	(*/+/?)?	最少匹配;	非贪婪模式;	匹配尽可能少的字符串;	

			--	(*/+/?)+	最多匹配;	匹配尽可能多的字符串;		不可回溯;
	
	
	5、	{a,b}【?+】
			--	{a,b}?		匹配最少的次数,能匹配a次就匹配a次;	非贪婪模式;
			--	{a,b}+		匹配最多的次数,能匹配b次就匹配b次;	最多模式;	不可回溯;
			
			

	6、	(...)
			--	创建一个组,可能允许取回匹配到的子字符串。


	7、	(?X...)
			--	这个东西,只是一种通用语法的描述;它没有定义任何具体功能。
			--	这个东西的功能,由“X”定义。
			
			
	8、	(?aiLmsux)
			--	匹配“空字符串”
	
	
	9、	(?:...) 和 (?X-Y:...)
			--	主要用于“丢弃不需要的内容 ... ”。
			--	用于“排除”不想匹配的内容。丢弃“不需要的内容 ... ”
			--	不捕捉:	不能“取回捕捉内容”,不能“引用匹配内容”。
			--	不捕捉,不取回,不引用


	10、	(*+?)+ 等价形式:	最多匹配,可捕捉,不能回溯
			--	A*+		<==>	(?>A*)
			--	A++		<==>	(?>A+)
			--	A?+		<==>	(?>A?)


	11、	(?P<name>...) 和 (?P=name)
			--	(?P<name>...)
				--	创建“有名称的组”;
				--	创建一个带有“名字”的组;
			--	(?P=name)
				--	引用“有名称的组”


	12、	(?#...):		
			--	在pattern中,添加“注释内容”
			--	示例
				--	pattern	=	r"xyz(?#variable name)-abc"
				--	pattern	起作用的部分为:		r"xyz-abc"
				


	13、	定义:		lookahead和lookbehind
			---ABC--	(被匹配的字符串)
				--	B:	为当前位置(匹配时,当前指针所在位置)
				--	A:	A相对于B,为behind; 在时序上,behind叫做“过去(前续/前相邻)”;
				--	C:	C相对于B,为ahead; 在时序上,ahead叫做“未来(后续/后相邻)”


	14、	(?=...) 和 (?!...)
			--	(?=...)
				--	not consume;	lookahead match;
				--	限定了“后续匹配内容”;	后续匹配内容为...
				--	s="xyzdef",	pattern = "xyz(?=def)"
					--	匹配“后续为def”的xyz;
					--	"xyzdef"中的xyz,匹配成功。
			--	(?!...) 
				--	not consume;	lookahead not match;
				--	限定了“后续匹配内容”;	后续匹配能容不能为...
				--	s="xyzdef",	pattern = "xyz(?!def)"
					--	匹配“后续内容不为def”的xyz;
					--	"xyzdef"中的xyz,匹配失败。

			--	概述:
				--	这两个匹配模式,是限定了“后续匹配内容”的模式。
				--	这两个匹配模式,都是以“后续内容”为匹配的限定条件;
					这属于双次限定(第一次限定了匹配的字符串;第二次限定了匹配字符串的后续内容)


	15、	(?<=...) 和 (?<!...)
			--	(?<=...)
				--	not consume;	lookbehind
				--	限定了“前续匹配内容”;	前续匹配内容为...
					--	s="defxyz",	pattern = "xyz(?<=def)"
					--	匹配“前续内容为def”的xyz
					--	"defxyz"中的xyz,匹配成功。
			--	(?<!...)
				--	not consume;	lookbehind
				--	限定了“前续匹配内容”;	前续匹配内容不为...
					--	s1="defxyz",	s2="abcxyz",	pattern = "xyz(?<!def)"
					--	"defxyz"中的xyz,匹配失败。
					--	"abcxyz中的xyz",匹配成功。
			
			--	概述:
				--	这两个匹配模式,是限定了“前续匹配内容”的模式;
				--	这两个模式,属于双次限定的匹配模式。


	16、	(?(id/name)yes-patter|no-pattern)
			--	当(id/name)存在时,执行"yes-patter";	当(id/name)不存在时,执行"no-pattern"。
			
	
	17、	(?>...)
		--	概要:		原子分组内容,pattern一旦匹配,便不回溯;		用途是“快速筛选”。
		--	概述:		在Python的re模块中,(?>...)是一个原子分组(atomic grouping)语法,属于正则表达式的高级特性。
		--	功能:
			--	它的作用是:
				--	原子分组内的匹配一旦开始,就会独占匹配,不会进行回溯
				--	如果原子分组内的模式匹配失败,正则引擎会立即放弃整个分组,不会尝试其他可能性
				--	这可以提高匹配效率,特别是在处理复杂模式时
		--	举例:
			--	普通分组 (a|ab)c 匹配 "abc" 时会先尝试 "a",失败后再回溯尝试 "ab"
			--	原子分组 (?>a|ab)c 匹配 "abc" 时,如果选择了 "a" 就会直接失败,不会回溯尝试 "ab"
				原子分组常用于:
				--	优化正则表达式性能
				--	防止灾难性回溯
				--	确保某些模式必须完整匹配
				注意:这个特性在Python 3.11+中才被完整支持,早期版本可能需要使用第三方regex库。

 

 

二、参考内容

 

  1、  re  -  https://docs.python.org/3/library/re.html

 

posted on 2025-05-17 16:47  lnlidawei  阅读(40)  评论(0)    收藏  举报