一、常用的匹配规则
在线正则表达式测试工具https://tool.oschina.net/regex/?optionGlobl=global#,输入待匹配的文本, 然后选择常用的正则表达式,就可以得相应的匹配结果了。
二、python正则库re及方法
1.match()
**介绍:**从字符串的起始位置开始匹配;在match ()方法中,第一个参数传入了正则表达式:pattern,第二个参数传入了要匹配的字符串:string。
函数:re.match(pattern,string)得到的结果是到结果是SRE_Match 对象。该对象有两种方法:
- re.match().group():正则表达式规则所匹配的内容;
- re.match().span():输出匹配的范围
**目标匹配:**使用()括号将想提取的子字符串括起来,()实际上标记了一个子表达式的开始和结束位置,被标记的每个子表达式会依次对应每一个分组,调用group ()方法传入分组的索引即可获取提取的结果。
connent = 'hello 123 4557 world_This is phone'
result = re.match('^hello\s(\d+)\s(\d+)\s\w{10}',connent)
print(result.group(1))
通用匹配:.*;将中间部分直接省略,全部用. *来代替,最后加一个结尾字符串
connent = 'hello 123 4557 world_This is phone'
#result1 = re.match('.*',connent)
#result1 = re.match('hello.*is',connent)
result1 = re.match('hello.*phone$',connent)
print(result1)
print(result1.group())
print(result1.span())
贪婪与非贪婪:
- 贪婪: .*会匹配尽可能多的字符,有时候,匹配结果会莫名其妙少了一部分内容。
connent = 'hello 123 4557 world_This is phone'
result2 = re.match('hello.*(\d+).*phone$',connent)
print(result2)
print(result2.group(1))
print(result2.span())
结果只有7
- 非贪婪:.*?尽可能匹配少的字符
connent = 'hello 123 4557 world_This is phone'
result2 = re.match('hello.*?(\d+).*phone$',connent)
print(result2)
print(result2.group(1))
print(result2.span())
结果是:123
所以说,在做匹配的时候,字符串中间尽量使用非贪婪匹配,也就是用.*?叫来代替.*,以免出现匹配结果缺失的情况。
**注意:**如果匹配的结果在字符串结尾.*?就有可能匹配不到任何内容了,因为它会匹配尽可能少的字符。
修饰符
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。如换行符
注意:.匹配的是除换行符之外的任意字符;当遇到换行符时,.*?的就不能匹配了,所以导致匹配失败。这里只需加一个修饰符re.S ,即可修正这个错误:
connent1 = 'hello 123 4557 world_This ' \
'is phone'
result3 = re.match('hello.*?(\d+).*phone$',connent1,re.S)
print(result3)
print(result3.group(1))
print(result3.span())
re.S 在网页匹配中经常用到。因为HTML 节点经常会有换行,加上它,就可以匹配节点与节点之间的换行了。
转义匹配
我们知道正则表达式定义了许多匹配模式,如. 匹配除换行符以外的任意字符,但是如果目标字符串里面就包含.,那该怎么办呢?这里就需要用到转义匹配了。
当遇到用于正则匹配模式的特殊字符时,在前面加反斜线转义一下即可。例如.就可以用.来匹配。
connent2 = 'hello.1234557 world_This ' \
'is phone'
result4 = re.match('hello\.*?(\d+).*phone$',connent2,re.S)
print(result4)
print(result4.group(1))
print(result4.span())
connent2 = 'hello.1234557*world_This ' \
'is phone'
result4 = re.match('hello\.*?(\d+)\*',connent2,re.S)
print(result4)
print(result4.group(1))
print(result4.span())
2.search()
match ()方法是从字符串的开头开始匹配的,search ()它在匹配时会扫描整个字符串,然后返回第一个成功匹配的结果。也就是说,正则表达式可以是字符串的一部分,在匹配时, search ()方法会依次扫描字符串,直到找到第一个符合规则的字符串,然后返回匹配内容,如果搜索完了还没有找到,就返回None 。
尝试提取class 为active 的li 节点内部的超链接包含的歌手名和歌名,此时需要提
取第三个li 节点下a 节点的singer 属性和文本。
3.findall()
search ()方法的用法,它可以返回匹配正则表达式的第一个内容,但是如果想要获取匹配正则表达式的所有内容,那该怎么办呢?这时就要借助findall ()方法了。
findall ()该方法会搜索整个字符串,然后返回匹配正则表达式的所有内容。还是上面的HTML 文本,如果想获取所有a 节点的超链接、歌手和歌名,就可以将search ()方法换成findall ()方法。如果有返回结果的话,就是列表类型,所以需要遍历一下来依次获取每组内容。代码如下:
4.sub()
可以修改文本内容,比如去掉一串文本中的数字。
5.compile()
前面所讲的方法都是用来处理字符串的方法,最后再介绍一下compile ()方法,这个方法可以将
正则字符串编译成正则表达式对象,以便在后面的匹配中复用。示例代码如下:
另外, compile ()还可以传入修饰符,例如re . S 等修饰符,这样在seach() 、findall() 等方法中就不需要额外传了。所以, compile ()方法可以说是给正则表达式做了一层封装,以使我们更好地复用。