数据提取之re
正则表达式
在线测试网址:https://tool.oschina.net/regex/
一:匹配单个字符
-
匹配某个字符
-
(.)匹配任意字符,但是--不匹配换行符[\n或\r\n]
-
\d 匹配任意的数字(0-9)
-
\D 匹配任意非数字
-
\s--小写--匹配空白字符(\n,\t,\r,和空格)
-
\S--大写--匹配任意的非空白字符
-
\w--小写--匹配a-z,A-Z,数字和下划线 [a-zA-Z0-9_]
-
\W--大写--匹配非字母数字下划线.等价于[^a-zA-Z0-9_]
-
[]用来表示一组字符--匹配第一个满足任意正则表达式的字符 相当于字符串中字符一个一个去匹配re,匹配上了就输出 import re text="0746-123456789" ret=re.search('[\d-]',text) #匹配结果为0,匹配一个满足的字符,后面的就不匹配了 ret=re.search('[\-\d\d]',text) #匹配结果为0 print(ret.group())
二:匹配多个字符
-
*:匹配0或者任意多个字符 text="0746-123456789" ret=re.search('\d*',text) #匹配结果为0476
-
+:匹配1个或者多个
-
?:匹配0个或者1个--非贪婪
-
{m}:指定具体多少个 text="0746-123456789" ret=re.search('\d{2}',text) #匹配结果为07
-
{m,n}:匹配最少m个,最多n个---贪婪匹配
三:小案列
-
验证手机号
规则:以1开头,第二位可以是[34587],后面9位任意数字 pattern='1[34587]\d{9}'
-
验证邮箱
规则:邮箱名称是用数字,字母,下划线组成,然后是@符号,后面是域名 pattern='\w+@\w+\.[a-zA-Z\.]+' 注意:@前面至少要有1个,所以用+ 转义\. com或者com.cn--- 用[a-zA-Z\.]+任意字母和.
-
验证URL
规则:http或者http或fts等协议头,再加上:// ,然后任意非空白字符 pattern='(http|https|ftp)://[^\s]+' pattern='[a-zA-Z]://[^\s]*'
-
验证身份证
规则:身份证共19位,前17位是数字,最后一位可以使小写x,大写X,数字 pattern='\d{17}[xX\d]'
四:注意点
贪婪模式
.+ .*:匹配任意字符
非贪婪模式
.+? .*?
^:以...开头
$:以...结尾
转义
五:re模块中的常用函数
- re.match('pattern',str,修饰符):从开始的位置进行匹配,如果开始的位置没有匹配到,就返回None
- match()函数适合用来做检测,判断某个字符串是否符合某个re规则
str='hello'
ret=re.match('h',str)
print(ret.group()) # 结果为h
#group() 会输出完成的匹配结果
#group(1) 会输出完整匹配中--用第1个()括起来的字符串
分组:使用()的方式
1:group()和group(0)是一样的,都是返回完整的匹配内容
2:groups() :返回的是里面的子组,索引从1开始
3:group(1) :返回的第一个子组,同上
str="apple's price is $10,pink's price is $11"
pattern='.*(\$\d+).*(\$\d+)'
ret=re.match(pattern,str)
print(ret.group()) # apple's price is $10,pink's price is $11
print(ret.groups()) # ('$10', '$11')
print(ret.group(1)) # $10
print(ret.group(1,2)) # ('$10', '$11')
修饰符号:
re.I 使匹配对大小写不敏感
re.S 使.匹配包括换行符在内的所有内容
pattern='.*(\$\d+).*(\$\d+)'
ret=re.match(pattern,str,re.S)
-
re.search():会扫描整个字符串,然后返回 第一个成功匹配的结果,如果扫描完了没匹配上,就返回None
-
re.findall():匹配满足正则表达式的所有内容,返回一个列表
遍历依次来获取每组内容
-
re.sub(pattern,“要替换的字符串”, 原字符串 )
html=re.sub('<a.*?>|</a>',"",html) #使用sub()方法将a节点去掉
-
re.split():使用正则表达式来分割字符串
str="hello world i love you" ret=re.split('\W',str) print(ret) # ['hello', 'world', 'i', 'love', 'you'] str="hello&world i love you" ret=re.split(' |&',str) print(ret) # ['hello', 'world', 'i', 'love', 'you'] ret=re.split('^[a-zA-Z]',str)
-
re.compile():将常用 正则字符串,编译成 正则表达式对象,以便在后面复用