【正则表达式】?的用法总结(预见匹配、非贪婪、条件匹配、忽略分组)

我们直入正题,来了解正则表达式中的“?”究竟有哪些作用

一、判断单个字符

(1)判断“?”前面一个正则表达式字符出现0次或者1次

此处,?之前的一个正则表达式字符是1,那么就是判断“1”出现了1次还是出现0次

tips:其实在这里,已经有了非贪婪作用的体现了

re.match(r"1?123", "1123")  # 结果为1123
二、非贪婪

(2)限定前面一个/组正则表达式尽量少次数的去匹配

此处,?之前的正则表达式为“\d*”,匹配任意阿拉伯数字任意次;后面加个?之后,便限制了*的匹配个数,之后后续有“111”的字符串存在,那么\d便不再向后匹配

re.match(r"\d*?111", "521111")  # 结果为52111
三、预见

针对需求:目标字符串之前或者之后存在指定字符串

(3)限定目标字符串前后的内容

限制匹配目标前的内容,注意顺序不能颠倒

re.search(r"(?<!num)\d+", "num123")  # 结果为23
re.search(r"(?<!num)\d+", "123")  # 结果为123
re.search(r"(?<=num)\d+", "num123")  # 结果为123
re.search(r"(?<=num)\d+", "123")  # 结果为None

限制匹配目标后的内容,注意顺序不能颠倒

re.search(r"\d+(?!num)", "123num")  # 结果为12
re.search(r"\d+(?!num)", "123")  # 结果为123
re.search(r"\d+(?=num)", "123num")  # 结果为123
re.search(r"\d+(?=num)", "123")  # 结果为None
四、条件匹配

针对需求:目标字符串内容根据前面指定字符串内容而定

(4)进行条件匹配,指定字符串存在,匹配前者,否则匹配后者

给定字符串“123qwe456”

要求:在存在123的情况下,qwe后面跟456;否则,qwe后面跟789

re.match(r"(123)qwe(?(1)456|789)", "123qwe456")  # 结果为123qwe456
re.match(r"(123)?qwe(?(1)456|789)", "qwe789")  # 结果为qwe789
五、忽略分组

(5)?:,二者联合使用,可忽略本分组

此类用法和预见匹配相似,但并不雷同。此种用法,?:后面可以跟正则表达式,而第三种预见用法,?<=后面只能跟匹配内容

作用是在保证匹配前提的情况下,不保存这个前提条件

re.match(r"(?:\d)([a-z])", "3a").group(1)  # 结果为'a'

但是:

    1.此种用法,如果代码中([a-z])的括号不存在,即没有默认输出的分组,那么便匹配不出来。

    2.输出时,必须是group(1),如果不带1这个序号,那么匹配出来的结果仍是“3a”






猜你喜欢

转载自blog.csdn.net/baidu_28289725/article/details/80414445