#coding=utf-8
#Version:python 3.6.0
#Tools:Pycharm 2017.3.2
import re
content ='Hello 123 4567 World_This is a Regex Demo'
# print(len(content))
# 开头的^是匹配字符串的开头,也就是以 Hello 开头;然后\s匹配空白字符,用来匹配目标字符串的空格;\d匹配数字,3个\d匹配 123;然后再写1个\s匹配空格;后面还有 4567 ,我们其实可以依然用4个\d来匹配,但是这么写比较烦琐,所以后面可以跟{4}以代表匹配前面的规则4次,也就是匹配 4 个数字;然后后面再紧接 l 个空白字符,最后\w{10}匹配 10 个字母及下划线.
result = re.match('^Hello\s\d\d\d\s\d{4}\s\w{5}', content)
# print(result)
print(result.group())
print(result.span())
# 可以使用()括号将想提取的子字符串括起来.()实际上标记了一个子表达式的开始和结束位置,被标记的每个子表达式会依次对应每一个分组.调用group()方法传入分组的索引即可获取提取的结果.
result = re.match('Hello\s(\d+)\sWorld', content)
print(result)
print(result.group())
print(result.group(1))
# 其中.(点)可以匹配任意字符(除换行符),*(星)代表匹配前面的字符无限次,所以它们组合在一起就可以匹配任意字符了
result = re.match('^Hello.*Demo$', content)
# 贪婪与非贪婪
# (.*)贪婪匹配是尽可能匹配多的字符,(.*?)非贪婪匹配就是尽可能匹配少的字符,而交给后面的\d去匹配,如果匹配的结果在字符串结尾,.*?就有可能匹配不到任何内容了,因为它会匹配尽可能少的字符
# 当遇到换行符时,.*?的就不能匹配了,所以导致匹配失败.这里只需加一个修饰符 re.S ,即可修正这个错误:
result1 = re.match('^Hello.*?(\d+).*?Demo$', content, re.S)
# 当遇到用于正则匹配模式的特殊字符时,在前面加反斜线转义一下即可
# content ='(百度)www.baidu.com'
# result = re.match('\(百度\)www\.baidu\.com', content)
# match()方法是从字符串的开头开始匹配的,一旦开头不匹配,那么整个匹配就失败了
#方法search(),它在匹配时会扫描整个字符串,然后返回第一个成功匹配的结果.也就是说,正则表达式可以是字符串的一部分,在匹配时,search()方法会依次扫描字符串,直到找到第一个符合规则的字符串,然后返回匹配内容,
# 把match()换成search()就好了
# search()只返回匹配到的第一个内容,findall()可返回全部
# sub()
# 第一个参数传入\d+来匹配所有的数字,第二个参数为替换成的字符串(如果去掉该参数的话,可以赋值为空),第三个参数是原字符串.
content = '54aKS4yrsoiRS4ixSL2g'
content = re.sub('\d+', '', content)
print(content)
#运行结果: aKyroiRixlg
# 在适当的时候,借助sub()方法可以起到事半功倍的效果
# compile()
# 这个方法可以将正则字符串编译成正则表达式对象,以便在后面的匹配中复用
import re
contentl = '2016 12 15 12:00'
content2 = '2016-12-17 12:55'
pattern = re.compile('\d{2}:\d{2}')
resultl = re.sub(pattern, '', contentl)
result2 = re.sub(pattern, '', content2)
print(result1, result2)
# compile()还可以传入修饰符,例如re.S等修饰符,这样在search(),findall()等方法中就不需要额外传了
明天抽空码一下多线程爬虫