正则表达式,通常写成regex,是用于识别正则字符串的,返回符合规定的字符串,正则字符串是可以用一系列线性规则构成的字符串。例如列了以下规则:
1.开头是字母‘a’;
2.结尾是字母‘b’;
满足上面两个规则的字符串可以是“azxczxcb”,也可以使"agfgfgb",满足的字符串可以有N多个,但字符串"bbb"就不满足,所以不会被匹配。
正则表达式包含了单个或多个“规则”,用各种符号字母来表示出来,以下是一些常用的正则表达式符号:
符号 | 含义 | 例子 | 匹配结果 |
---|---|---|---|
* | 匹配前面的字符,子表达式或者括号里的字符0次或多次 | a * b * | aaaaaa,bbbb,aaabbb |
+ | 匹配前面的字符,子表达式或者括号里的字符至少1次 | a+b+ | abbbb,ab,aaaab |
[ ] | 匹配中括号里的任意一个字符 | [A-Z] | A,B,C |
( ) | 表达式编组(括号中的会看成一个整体) | (ab)* | ab,abab |
{m,n} | 匹配前面的字符,子表达式或者括号里的字符m到n次 | a{2,3} | aa,aaa |
[^] | 取反,即匹配任意一个不在中括号中的字符 | [^A-z] | a,b |
| | 匹配任意一个用|分割的字符 | a|b|c | a,b,c |
. | 匹配任意一个单个字符 | a.c | abc,afc,agc |
\ | 转义字符 | \.\|\\ | .|\ |
\d | 匹配任何十进制数字(\D相当于\d的取反操作) | \d* | 151213,123456 |
\w | 匹配任何的字母数字字符(\W相当于\d的取反操作) | \w+ | 12asda,123ABC |
\s | 匹配任何空白字符空格,制表,回车(\S为\s的取反操作) | \s |
以上是比较常见的正则表达式中的符号及其含义,当我们通过爬虫获取一个文本文件时,想要再从中选取需要的部分,就可以使用正则表达式来帮助我们选取。
match
import re
str="abcd123456 789efgABC000"
pattern="\w+"
obj=re.match(pattern,str)
print(obj)
结果将输出
import re
str="abcd123456 789efgABC000"
pattern="\W+"
obj=re.match(pattern,str)
print(obj)
结果将输出None,这是因为match将会从字符串的开始位置找,开头找不到,那就返回None。
search
还是用上面那个代码,但把match改成search
import re
str="abcd123456 789efgABC000"
pattern="\W+"
obj=re.search(pattern,str)
print(obj)
结果将输出
sub
sub函数是用来将匹配到的内容替换成别的内容的函数,
re.sub(pattern,repl,string,count=0,flags=0)
pattern:正则表达式
repl:替换用的字符串
string:字符串
count:替换次数,默认为0,即全部替换
flags:正则表达式修饰符,见后面
import re
str="abcd123456 789efgABC000"
pattern="\W+"
obj=re.sub(pattern,"XXXX",str)
print(obj)
将上面匹配空格的代码改一下,结果输出abcd123456XXXX789efgABC000,空格被替换成了XXXX。
compile
re.compile(patttern),生成一个正则表达式对象
import re
str="abcd123456 789efgABC000"
pattern="\W+"
p=re.compile(pattern)
obj=p.sub("XXXX",str)
print(obj)
还是将上面的代码改一下,将正则表达式封装成一个对象,结果和之前一样。
findall
findall和search差不多,区别在于findall可以查找到所有匹配到的地方,search只能返回找到的第一处
import re
str="abcd123456 789efgABC000 123 456"
pattern="\W+"
obj=re.findall(pattern,str)
print(obj)
findall将结果以列表形式返回,[’ ', ’ ', ’ ']
finditer
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
import re
str="abcd123456 789efgABC000 123 456"
pattern="\W+"
obj=re.finditer(pattern,str)
for i in obj:
print(i)
结果:
正则表达式修饰符
前面提到的方法,都可以添加正则表达式修饰符,例如
re.match(pattern,string,flags=0)
re.search(pattern,string,flags=0)
…
常见的修饰符如下
re.I | 忽略大小写(是字母i的大写不上l) |
---|---|
re.L | 做本地化处理 |
re.M | 多行模式 |
re.S | 使.匹配能匹配换行符等任意字符 |
re.X | 增加可读性 |
re.U | 根据Unicode字符集解析字符 |
import re
str="abcd123456 789efgABC000 123 456"
pattern="abc"
obj=re.findall(pattern,str,re.I)
print(obj)
结果为[‘abc’, ‘ABC’]。