python正则表达03--常用方法补充和细节总结

521 阅读3分钟

这是sylu计算机协会第一次技术征文活动

sub方法

可以简单地理解为替换功能

  • 语法
re.sub(pattern, repl, string)
参数意义
pattern匹配的正则表达式
repl替换的内容
string匹配的对象
  • 示例
result = re.sub(r'\d+','90','java:100,python:100')
print(result)
>>>java:90,python:90
import re
def func(temp):
    num = temp.group()
    num1 = int(num)+1
    return str(num1)
result = re.sub(r'\d+',func,'java:100,python:100')
print(result)
>>> java:101,python:101

split方法

在字符串中搜索到正则匹配的内容就分割

  • 语法
re.split(pattern, string, flags=0)
参数意义
flags控制正则表达式的匹配方式
pattern正则表达式
string要匹配的字符串(传入的变量)
  • 示例
result = re.split(r'[,:]','java:100,python:100')
print(result)
>>> ['java', '100', 'python', '100']

小结

admin = 'admin001'
re.match('[a-zA-Z][0-9a-zA-Z]{5,}$',admin)
re.search('^[a-zA-Z][0-9a-zA-Z]{5,}$',admin)
re.findall('^[a-zA-Z][0-9a-zA-Z]{5,}$',admin)
  • 注意以上在用match,search,findall时正则表达式的^和$必须依据三者的检索特点来判断是否写与不写

  • 邮箱验证

email = '1727328835@qq.com'
result = re.match(r'\w{5,20}@(163|126|qq)\.(com|cn)$',email)
print(result)

起名分组

  • 分组
phone = '010-12312333'
result = re.match(r'(\d{3}|\d{4}-(\d{8}))$',phone)
print(result)

#能够按组输出结果
print(result.group()) # 输出全部内容
print(result.group(1)) # 输出第一组内容(即第一个括号的内容)
print(result.group(2)) # 输出第二组内容(即第二个括号的内容)

上面的正则表达式中一个小括号代表一组,而想要调用比较结果中的各组内容直接group(组数)即可,那这样组数一多我们该怎么办呢?

  • 起名
mgs = '<html><h1>abc</h1></html>'
import re
result = re.match(r'<(?P<name1>\w+)><(?P<name2>\w+)>(.+)</(?P=name2)></(?P=name1)>',mgs)
print(result)
print(result.group())
print(result.group(1))
print(result.group(2))

起名方式:(?P<名字>正则表达式) 引用方式:(?P=名字)

  • 通过起名的方式我们可以很清楚的使用已经写好的正则可以防止重复劳动

匹配分组的两种方式

  • number的方式
mgs = '<html><h1>abc</h1></html>'
import re
result = re.match(r'<(?P<name1>\w+)><(?P<name2>\w+)>(.+)</\2></\>$',mgs)
print(result)
print(result.group())
print(result.group(1))
print(result.group(2))

该方法适用于标签较少的情况下应用

  • 起名的方式
mgs = '<html><h1>abc</h1></html>'
import re
result = re.match(r'<(?P<name1>\w+)><(?P<name2>\w+)>(.+)</(?P=name2)></(?P=name1)>',mgs)
print(result)
print(result.group())
print(result.group(1))
print(result.group(2))

该方式适合标签多的情况下使用,此方法调理更加清晰

贪婪和非贪婪

在python中是数量词的默认就是贪婪的(在少数的语言中也可以是默认的非贪婪)

  • 贪婪

贪婪就是总是尝试匹配尽可能多的字符

  • 非贪婪

非贪婪则相反,总是尽可能尝试匹配尽可能少的字符

在"*","?","+","{m,n}"后面加"?",就可以使贪婪变为非贪婪。

总结

正则常用的符号

基础:

.:任意字符

[]:范围

|:或者

():一组

量词:

*:匹配次数大于等于0

+:匹配次数大于等于1

?:匹配次数为0或1

{m,}:匹配次数大于等于m

{m,n}:匹配次数在m-n之间

预定义:

\a:space

\S: not space

\d: digit

\D: not digit

\w: word [0-9a-zA-Z]

\W:not word [^0-9a-zA-Z]

\b:匹配边界(左右边界都可以)

  • 有了上面学习的基础我们简单的来写一个爬虫玩玩把
import re
import requests
path = <img border="0" alt="小猪佩奇头像" src="http://img.2qqtouxiang.com/pic/TX9649_01.jpg" width="350">
result = re.match(r'<img border="0" alt="小猪佩奇头像" src="(.*?)"',path)
image = result.group(1)
response = requests.get(image)
with open('pig.jpg','wb') as wstream:
    wstream.write(response.content)