一般的正则表达式都可直接到正则生成工具处生成,
http://tool.oschina.net/regex/
为常用的在线正则表达式工具
常见匹配字符
re.match及其常规匹配
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
re.match(pattern, string, flags = 0)
返回的为一个对象,其中span代表长度 加上group方法会返回数据信息 加上span方法会返回长度
泛匹配
匹配目标
使用()来表示想要返回的group 其中第一个()为group(1),第二个为group(2)
贪婪匹配
贪婪模式中.* 会尽可能多的匹配,从而匹配了123456。贪婪模式为正则的默认匹配模式
非贪婪匹配
通过加上?,转换为非贪婪模式,从而尽可能少的匹配,如下例对于1234567,并无匹配,可以理解为,通过?让*.变的懒惰了
匹配模式
匹配模式即为flag参数. 下例中,由于不能匹配换行符,不配置flag会返回None;故需要将匹配模式变为re.S,*.即可匹配任意字符
转义
字符中会出现转义字符,如$,.等,需要通过加上反斜杠\来表示后面的字符为转义字符
总结:尽量使用泛匹配、使用括号得到匹配目标、尽量使用非贪婪模式、有换行符就用re.S
re.search
re.search 扫描整个字符串并返回第一个成功的匹配。相比于re.match,re.search不需要从第一个字符开始匹配。
案例1:
使用re.search筛选html内容
re.findall
从上例中,可以发现match和search都有一定的限制性,即不可以返回符合条件的所有字符。所以一般在进行爬虫时会使用findall方法会更多一点。findall方法会搜索字符串,以列表形式返回全部能匹配的子串。
改进:上例中,并没有筛选出第一条数据,这是由于第一条数据没有a标签
用\s
?表示换行(\s代表空白字符,
表示有一个或多个,?表示可有可没有)
用()可表示里面内容为一个整体,()?表示()内内容可有可无
results = re.findall('<li.*?>\s*?(<a.*?>)?(\w+)(</a>)?\s*?</li>', html, re.S)
print(results)
for result in results:
print(result[1])
re.sub
替换字符串中每一个匹配的子串后返回替换后的字符串
import re
content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
content = re.sub('\d+', '', content)
print(content)
Extra stings Hello World_This is a Regex Demo Extra stings
content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
content = re.sub('\d+', 'Replacement', content)
print(content)
Extra stings Hello Replacement World_This is a Regex Demo Extra stings
\1表示要被替换的第一个group
content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
content = re.sub('(\d+)', r'\1 8910', content)
print(content)
Extra stings Hello 1234567 8910 World_This is a Regex Demo Extra stings
re.sub和re.findall共同配合进行信息提取
对于歌词的例子,实际上通过sub先将a标签删去再进行findall会更加简单
html = re.sub('<a.*?>|</a>', '', html)
print(html)
import re
)print(results)for result in results: print(result.strip())结果:一路上有你 沧海一声笑 往事随风 光辉岁月 记事本 但愿人长久
re.compile
re.compile将正则字符串编译成正则表达式对象
将一个正则表达式串编译成正则对象,以便于复用该匹配模式
content = '''Hello 1234567 World_This
is a Regex Demo'''
pattern = re.compile('Hello.*Demo', re.S)
result = re.match(pattern, content)
#result = re.match('Hello.*Demo', content, re.S)
print(result)
<_sre.SRE_Match object; span=(0, 40), match='Hello 1234567 World_This\nis a Regex Demo'>