正则表达式贪婪与非贪婪——就在多一问? 引出思考——少做事!

    xiaoxiao2021-04-16  243

    一、必须记住的——原子符

    在分享一些学习出神的思考前,我们还是先来记住一些干货。 愿字符汇总: 匹配字符: . […] [^…] \d \D \w \W \s \S 匹配重复: * + ? {n} {m,n} 匹配位置: ^ $ \A \Z \b \B 其他: | () 详细内容:

    1.普通字符

    匹配规则: 每个普通字符匹配其对应的字符

    In : re.findall("ab","abcda") Out: ['ab']

    注意:可以匹配utf-8字符

    2.或

    元字符: | 匹配规则: 匹配 | 两侧任意正则表达式规则

    In [13]: re.findall("ab|cd","abcdefgh") Out[13]: ['ab', 'cd']

    3.匹配单个字符

    元字符: . 匹配规则: 匹配除换行外任意一个字符

    In [16]: re.findall("张.丰","张三丰,张四丰,张五丰") Out[16]: ['张三丰', '张四丰', '张五丰']

    4.匹配字符集

    元字符 : [字符集] 匹配规则 : 匹配字符集中任意一个字符 表达形式: [abc#!好] --> 匹配其中任意一个 [0-9][a-z][A-Z] 匹配区间中任意一个 [_#?0-9a-z] 混合书写,区间写在后边

    In [18]: re.findall("[aeiou]","hello world") Out[18]: ['e', 'o', 'o']

    5.匹配字符集去反

    元字符:[^字符集] 匹配规则:匹配除了字符集以外的任意一个字符

    In [20]: re.findall("[^0-9]","27017 port") Out[20]: [' ', 'p', 'o', 'r', 't']

    6.匹配字符串开始位置

    元字符: ^ 匹配规则: 匹配字符串的开始位置

    In [4]: re.findall("^Jame","Jame,hello") Out[4]: ['Jame']

    7.匹配原子符结束为止

    元字符: $ 匹配规则: 匹配目标字符串的结尾位置

    in [6]: re.findall("Jame$","hi,Jame") Out[6]: ['Jame']

    8.匹配字符串重复

    元字符 : * 匹配规则: 匹配前面的字符出现0次或多次

    In [7]: re.findall("wo*","wooooo~~w!") Out[7]: ['wooooo', 'w']

    元字符 : + 匹配规则: 匹配前面的字符出现1次或多次

    In [9]: re.findall("wo+","wooooo~~w!") Out[9]: ['wooooo']

    元字符:? 匹配规则: 匹配前面的字符出现0次或1次

    In [15]: re.findall("-?[0-9]+","age:19,score:-60,00087") Out[15]: ['19', '-60', '00087']

    元字符 : {n} 匹配规则 : 匹配前面的字符出现n次

    In [16]: re.findall("1[0-9]{10}","tel: 18866889928") Out[16]: ['18866889928']

    元字符: {m,n} 匹配规则 : 匹配前面的字符出现m-n次

    In [19]: re.findall("[1-9][0-9]{5,10}","qq:798119") Out[19]: ['798119']

    9.匹配任意(非)数字字符

    匹配任意(非)数字字符 元字符 : \d \D 匹配规则: \d 匹配任意数字字符 [0-9] \D 匹配任意非数字字符 [^0-9]

    In : re.findall("\d{1,5}","mysql:3306,mongo:27017") Out[20]: ['3306', '27017'] in [20]: re.findall("\D{1,7}","mysql:3306,mongo:27017") Out[20]: ['mysql:', ',mongo:']

    10.匹配任意非不同字符串

    元字符: \w \W 匹配规则: \w 匹配普通字符 \W 匹配非普通字符 说明: 普通字符指,数字,字母,下划线,汉字

    In [21]: re.findall("\w+","server_addr=('127.0.0.1',8888)") Out[21]: ['server_addr', '127', '0', '0', '1', '8888'] In [22]: re.findall("\W+","server_addr=('127.0.0.1',8888)") Out[22]: ["=('", '.', '.', '.', "',", ')']

    11.匹配任意非空字符串

    元字符: \s \S 匹配规则: \s 匹配任意空字符 \S 匹配任意非空字符 说明: 空字符指, 空格 \r \n \t \v \f

    In [30]: re.findall("\w+\s+\w+","hello world") Out[30]: ['hello world']

    12.匹配字符串头和结算

    元字符 : \A \Z 匹配规则: \A ===> ^ \Z ===> $

    In [33]: re.findall("\A\w+\Z","helloworld") Out[33]: ['helloworld']

    使用技巧:如果正则表达式中同时出现^ $,则两者之间的正则表达式需要将目标字符串内容全部匹配

    13.匹配单词(非)边界位置

    元字符:\b \B 匹配规则: \b 匹配单词边界 \B 匹配非单词边界 说明:单词边界指普通字符(\w代表的字符)与其他字符的交界位置

    In [36]: re.findall(r"\bis\b","This is a test") Out[36]: ['is']

    二 、贪婪与非贪婪,就在多一问?

    贪婪模式: 默认情况下,匹配重复的元字符总是尽可能多的向后匹配更多内容。比如: * + ? {m,n} 非贪婪模式(懒惰) :让重复元字符尽可能少的匹配内容 贪婪–>非贪婪

    * --》 *? + --》 +? ?--》 ?? {m,n} --> {m,n}? In [66]: re.findall(r"\(.+?\)","(李-白),(杜-甫),(白 居 易)") Out[66]: ['(李-白)', '(杜-甫)', '(白 居 易)']

    三、由非贪婪多一问引出的思考

    1、接受教育是提高基线

    2、工程上,专业人士和业余爱好者的一个差别在于是否了解极限的存在

    3、工程师和科学家有一个不同,科学家常常是告诉大家这件事可以做,但是工程师要明白怎么做。

    4、为了达到上线的目标,需要有一条明确的通道,里面是一个个台阶,或者理解为行动步骤,通道之外,所有的事情都不要做——控制贪婪,砍掉其他事情,少做斜体样式事,做了10件60分的事,不如把一件事做到120分。


    最新回复(0)