Regular Expression
正则表达式:
一种使用表达式的方式对字符串进行匹配的语法规则,我们抓取到的网页源代码本质上就是一个超长的字符串,想从里面提取内容,用正则再合适不过了。
通俗来讲:
是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
正则的优点:速度快,效率高,准确性高
正则的缺点:新手上手难度有点儿高.
常见的元字符含义:
- . 匹配除换行符以外的任意一个字符
- ^ 匹配行首
- $ 匹配行尾
- ? 重复匹配0次或1次
- * 重复匹配0次或更多次
- + 重复匹配1次或更多次
- {n,} 重复n次或更多次
- {n,m} 重复n~m次
- [a-z] 匹配[a-z]任意字符
- [abc] a/b/c中的任意一个字符
- {n} 重复n次
- \b 匹配单词的开始和结束
- \d 匹配数字
- \w 匹配字母,数字,下划线
- \s 匹配任意空白,包括空格,制表符(Tab),换行符
- \W 匹配任意不是字母,数字,下划线的字符
- \S 匹配任意不是空白符的字符
- \D 匹配任意非数字的字符
- \B 匹配不是单词开始和结束的位置
- [^a] 匹配除了a以外的任意字符
- [^(123|abc)] 匹配除了123或者abc这几个字符以外的任意字符
这里面属于正则里面的量词的是:
* 重复零次或更多次
\d+ 重复一次或更多次
? 重复零次或一次
n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
re模块代码示例
所有代码均需import re
findall:匹配所有符合的内容:
import re
lst = re.findall(r"\d+", "我的电话号是:123456,我的女朋友电话号是:12345")
print(lst)
我们得到结果:
['123456', '12345']
finditar:匹配字符串中所有的内容[返回的是迭代器]:
it = re.finditer(r"\d+", "我的电话号是:123456,我的女朋友电话号是:12345")
for i in it:
print(i.group())
得到结果:
123456
12345
rearch,找到一个结果就返回,返回的结果是match对象,拿数据需要,group():
s = re.search(r"\d+", "我的电话号是:123456,我的女朋友电话号是:12345")
print(s.group())
得到结果:
123456
match从头开始匹配:
s = re.match(r"\d+", "123456,我的女朋友电话号是:12345")
print(s.group())
得到结果:
123456
预加载正则表达式:
obj = re.compile(r'\d+')
ret = obj.finditer("我的电话号是:123456,我的女朋友电话号是:12345")
for it in ret:
print(it.group())
ret = obj.findall("还我钱100000")
print(ret)
得到结果:
123456 12345 ['100000']