regex

2022/06/13 One-minute read

正则

正则的概念是很早很早以前就接触过的,但是并没有实际使用。记忆中开始实际使用的时候,似乎是我开始写java的时候。至于为什么使用正则,真的是忘了,但是我清楚的记得当时有一个东西无法匹配,我折腾了很久也无可奈何,最后还是找大佬指点了一下,我才豁然开朗。至此,我记住了全部匹配的\s\S,也是从那个时候开始正式接触正则的概念:零宽断言。我当时兴致勃勃的要深入理解正则表达式,达到随意写的状态,但是大佬一句话,正则表达式用的时候网上搜一下就行,没必要记。毕竟,你要匹配的很多网上的表达式写的都很好了,自己写还烂。

如今回看当初,只觉得好笑。初见正则,很多东西都搞不清楚,如search,findall,断言,匹配开头,匹配结尾,贪婪模式,非贪婪模式,匹配次数。大概是没有老师指点吧,现在回看觉得简单的东西,当时却折腾了很久,以至于当时气馁的感觉至今仍然能有些许感受。

人生不也是如此吗?在人生的某个节点上,我们感到无比痛苦,我们感到无可奈何,我们对自己无能而产生愤怒,产生痛苦。在那个时刻,我们备受煎熬,可,一旦往事随风后,再回头看,似乎也没什么大不了,不就是……

反复温习

正则表达式一段时间不使用后,就容易被遗忘。所以谨以这短短的几行文字做记录,以便后续快速回忆。

参考链接:

https://www.jb51.net/tools/regex.htm
https://www.runoob.com/w3cnote/reg-lookahead-lookbehind.html

Python代码

def regular_assertion():
    m_str = r'regex represents regular expression'
    print(f'match str:{m_str}')
    for index, value in enumerate(m_str):
        print(index, end='')
        print(value, end=' ')
    # 正向先行断言 负向先行断言 正向后行断言 负向后行断言
    reg = [r're(?=gular)', r're(?!g)', r'(?<=\w)re', r'(?<!\w)re']
    for i in range(4):
        print(f'\n匹配规则:{reg[i]}')
        m = re.finditer(reg[i], m_str)
        if m:
            print(f'匹配结果:')
            for _ in m:
                print(_, end=' ')
                print(_.group(), end='; '  

打印结果:

match str:regex represents regular expression
0r 1e 2g 3e 4x 5  6r 7e 8p 9r 10e 11s 12e 13n 14t 15s 16  17r 18e 19g 20u 21l 22a 23r 24  25e 26x 27p 28r 29e 30s 31s 32i 33o 34n 
匹配规则:re(?=gular)
匹配结果:
<re.Match object; span=(17, 19), match='re'> re; 
匹配规则:re(?!g)
匹配结果:
<re.Match object; span=(6, 8), match='re'> re; <re.Match object; span=(9, 11), match='re'> re; <re.Match object; span=(28, 30), match='re'> re; 
匹配规则:(?<=\w)re
匹配结果:
<re.Match object; span=(9, 11), match='re'> re; <re.Match object; span=(28, 30), match='re'> re; 
匹配规则:(?<!\w)re
匹配结果:
<re.Match object; span=(0, 2), match='re'> re; <re.Match object; span=(6, 8), match='re'> re; <re.Match object; span=(17, 19), match='re'> re; 

结语

子曰,温故而知新,诚不欺我