本文作者使用的python版本为: python 3.5.1
字符串是由一个个的字符连接而成的。正则表达式的匹配本质上就是在进行一个个的字符匹配。
字符匹配的方式是,导入一个字符,然后与匹配规则进行匹配,满足规则则匹配成功,否则匹配失败。
下面举例说明字符串匹配过程。
字符匹配
示例代码如下:
import re pattern = '[abc]' find_char = re.findall(pattern, r'abecdfgabecdfg') print(find_char)
上述代码定义了一个匹配规则 pattern,该pattern包含三个字符abc,然后查找字符串abecdfgabecdfg中满足pattern的所有字符,即找出a、b、c。并将匹配到的字符打印出来。
底层匹配过程是这样的:
先从字符串中录入第一个字符a,然后跟pattern匹配,发现a满足pattern,所以a匹配成功,返回a。
再从字符串中录入第二个字符b,然后跟pattern匹配,发现b满足pattern,所以b匹配成功,返回b。
再从字符串中录入第三个字符e,然后跟pattern匹配,发现e不满足pattern,所以e匹配失败。
依此类推直到完成整个字符串的匹配。
匹配的结果如下:
['a', 'b', 'c', 'a', 'b', 'c']
上面介绍了字符匹配的原理,这是正则表达式的核心,所有其他更加复杂的匹配情况,都是由字符匹配组合出来的。
下面介绍一下匹配一个单词的情况。感受下字符匹配如何演化成为单词匹配。
单词匹配
示例代码如下:
import re pattern = 'abc' str = 'abeabcdss' find_words = re.findall(pattern, str) print(find_words)
该例的功能是:从字符串str中匹配出所有的单词abc。
底层匹配过程是这样的:
初始情况:pattern的第一个字符a成为当前待匹配字符。
先从字符串中录入第一个字符a,然后跟当前待匹配字符匹配,由于待匹配字符时a,因此匹配通过,缓存a到匹配结果中,并设置字符b成为待匹配字符。
再从字符串中录入第二个字符b,然后跟当前待匹配字符匹配,由于待匹配字符时b,因此匹配通过,缓存b到匹配结果中,并设置字符c成为待匹配字符。此时缓存区中的值为ab。
再从字符串中录入第三个字符e,然后跟当前待匹配字符匹配,由于待匹配字符时c,因此匹配失败,情况缓存区,并设置字符a成为待匹配字符。
再从字符串录入第四个字符a,匹配成功。
再从字符串录入第五个字符b,匹配成功。
再从字符串录入第六个字符c,匹配成功。此时发现已经到了pattern末尾,则pattern匹配成功,返回匹配结果,清空缓存区。
继续录入字符进行pattern的第二次匹配。
匹配结果如下:
['abc']
从例子中可以看出,单词匹配其实是将单词分割成为了多个字符,然后按顺序进行字符匹配,当所有字符匹配成功时,单词匹配成功。
欢迎批评指正!