十分钟入门正则表达式
开发者几年筛log每次都是网上百度个正则式子存着,从未主动学习相关知识。最近在看《精通python网络爬虫》时看到其对正则的讲解简单明了,遂记录。
开始入门
什么是正则表达式/正则表达式能干什么?这里不再重复了。接下来我们直接进门正则表达式。
正则表达式包含以下基础元素:原子、元字符、模式修正符。下面会从这几个基础元素开始入门
原子
原子是正则表达式中最基本的组成单位,每个正则表达式中至少要包含一个原子,常见的原子有以下几类:
- 普通字符作为原子
- 非打印字符作为原子
- 通用字符作为原子
- 原子表
暂时不需要理解原子的作用,下一节元字符大家自然会get到。
普通字符作为原子
数字、大小写字母、下划线等都可以作为原子使用,示例程序:
import re
pattern="idu" # 包含三个原子 "i","d","u"
string="www.baidu.com"
result=re.search(pattern,string) # 从string中去匹配正则"idu"
print(result)
结果:
<span=(6,9), match="idu">
非打印字符作为原子
所谓非打印字符,指的是一些在字符串中用于格式控制的符号,如换行符等。下面仅介绍常用的非打印字符,如下表所示
符号 | 含义 |
---|---|
\n | 用于匹配一个换行符 |
\t | 用于匹配一个制表符 |
示例程序:
import re
pattern="\n" # 包含一个原子 换行符
string='"www.baidu
.com"'
result=re.search(pattern,string) # 从string中去匹配正则"idu"
print(result)
结果:
<span=(9,10), match="\n">
通用字符作为你原子
所谓通用字符,即一个原子可以匹配一类字符。我们实际使用中经常会用到这一类原子,常见通用字符及其含义如下表:
符号 | 含义 |
---|---|
\w | 匹配任意一个字母、数字或下划线 |
\W | 匹配除字母、数字或下划线以外的任意一个字符 |
\d | 匹配任意一个十进制数 |
\D | 匹配除十进制以外的任意一个其他字符 |
\s | 匹配任意一个空白字符 |
\S | 匹配除空白字符以外的任意一个其他字符 |
原子表
使用原子表,可以定义一组地位平等的原子,然后匹配的时候会取该原子表中任意一个原子进行匹配,原子表由 [ ] 表示。
比如 "[xyz]"
就是一个原子表,该原子表中定义了 3 个原子,这 3 个原子地位平等,如,我们定义正则表达式为 "[xyz]py"
,对应的源字符串是 "xpython"
,如果此时使用 re.search()
函数进行匹配,就可以匹配到结果 "xpy"
,因为此时只要py前一位是 x y x
字母中的任意一个字母,就都可以匹配成功。
类似的,"[^]"
代表的是除了中括号里面的原子均可以匹配成功,如 "[^xyz]py"
能匹配 "apy"
,但是却不能匹配 "xpy"
。
具体大家可以自己写用例试下。
元字符
所谓元字符,就是正则表达式中具有一些特殊含义的字符,比如重复N次前面的字符等。
在此,给大家copy了常见的一些元字符,如下表:
符号 | 含义 |
---|---|
. | 匹配除换行符以外的任意字符 |
^ | 匹配字符串的开始位置 |
$ | 匹配字符串的结束位置 |
* | 匹配0次、1次或多次前面的原子 |
? | 匹配0次或1次前面的原子 |
+ | 匹配1次或多次前面的原子 |
{n} | 前面的原子恰好出现n次 |
{n,} | 前面的原子至少出现n次 |
{n,m} | 前面的原子至少出现n次,至多出现m次 |
| | 模式选择符 |
() | 模式单元符 |
任意匹配元字符
首先讲解任意匹配元字符 "."
,我们可以使用 "."
匹配一个除了换行符以外的任意字符。
比如,可以重用正则表达式 ".python..."
匹配一个 "python"
字符前面有1位,后面有3位格式的字符(不包含换行符)。
示例如下:
import re
pattern=".python..."
string="abcdfphp345pythony_py"
result=re.search(pattern,string) # 从string中去匹配正则".python..."
print(result)
执行结果:
<span=(10,20), match="5pythony_p">
边界限制元字符
可以使用 "^"
匹配字符串的开始,使用 "$"
匹配字符串的结束。我们通过下面的例子来熟悉:
import re
pattern1="^abc"
pattern2="py$"
string="abcdfphp345pythony_py"
result1=re.search(pattern1,string)
result2=re.search(pattern2,string)
print(result1)
print(result2)
执行结果如下:
<span=(0,3), match="abc">
<span=(19,21), match="py">
以上程序中,正则表达式 pattern1 限制了必须要以 "abc"
开头,如果不以 "abc"
开头则无法成功匹配;正则表达式 pattern2 限制了必须以 "py"
结尾。
限定符
限定符也是元字符的一种,常见的限定符包括 * / ? / + / {n} / {n,} / {n,m}
,具体含义可以参考上面的表格,下面我们通过一个示例来分析下限定符的使用。
import re
pattern1="py.*n"
pattern2="cd{2}"
string="abcdddfphp345pythony_py"
result1=re.search(pattern1,string)
result2=re.search(pattern2,string)
print(result1)
print(result2)
执行结果:
<span=(13,19), match="python">
<span=(2,5), match="cdd">
模式选择符
接下来讲解模式选择符 "|"
,使用模式选择符,可以设置多个模式,匹配时,会从中选择任意一个模式匹配。比如正则表达式 "python|php"
中,字符串 "python"
和 "php"
均满足匹配条件。示例如下:
import re
pattern1="python|php"
string="abcdfphp345pythony_py"
string2="abcdfph345pythony_py"
result1=re.search(pattern1,string) # 会输出第一个匹配到的结果
result2=re.search(pattern1,string) # 会输出第一个匹配到的结果
print(result1)
print(result2)
执行结果:
<span=(5,8), match="php">
<span=(10,16), match="python">
模式单元符
下面介绍模式单元符 "( )"
,可以使用 "( )"
将一些原子组合成一个大原子使用,小括号括起来的部分会被当做一个整体去使用,示例如下:
import re
pattern1="(cd){1,}"
string="abcdcdcdcdfphp345pythony_py"
result1=re.search(pattern1,string)
print(result1)
执行结果:
<span=(2,10), match="cdcdcdcd">
模式修正符
所谓模式修正符,即可以在不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现对匹配结果的调整等功能。比如模式修正符 "I"
让对于模式在匹配时可以不区分大小写。
常见的模式修正符如下表:
符号 | 含义 |
---|---|
I | 匹配时忽略大小写 |
M | 多行匹配 |
L | 做本地化识别匹配 |
U | 使用Unicode字符及解析字符 |
S | 让.匹配包括换行符,即使用了该模式修正后,"."匹配就可以匹配任意字符了 |
需要注意,模式修正符不同语言使用方式不同,一般不是直接写在正则表达式字符串之中的。python中写法如下 re.search(pattern,string,re.I)