python复习100天

python复习第15天:python正则表达式

2020-04-06  本文已影响0人  潮办公

title: python复习第15天:python正则表达式
date: 2020-04-05 23:00:24
tags:
- python
- 爬虫
categories: python复习
top: 16


python正则表达式

正则的写法

使用大致步骤

  1. 使用compile将表示正则的字符串编译为一个pattern对象
  2. 利用Pattern对象提供的方法,对文本进行匹配,获取匹配结果
  3. 最后利用match对象提供的属性和方法后去信息,根据需要进行操作

常用匹配方法

match匹配

import re
text = '1234aash34235235fdosdf'
p = re.compile('[0-9]*')
result = p.match(text)
print(result)
print(result.group())
print(result.span())
"""
<re.Match object; span=(0, 4), match='1234'>
输出结果
1234
(0, 4)
"""
import re
text = '1234aash34235235fdosdf'
p = re.compile('([0-9]*)')  # 这里多了一个括号
result = p.match(text)
print(result)
print(result.group())
print(result.groups())
print(result.span())
"""
<re.Match object; span=(0, 4), match='1234'>
1234
('1234',)
(0, 4)
"""

search匹配

import re
text = 'a1234aash34235235fdosdf'
p = re.compile('[0-9]+')
result = p.search(text)
print(result)
print(result.group())
"""
<re.Match object; span=(1, 5), match='1234'>
1234
"""

findall匹配

import re
text = 'a1234aash34235235fdosdf'
p = re.compile('[0-9]+')
result = p.findall(text)
print(result)
"""
['1234', '34235235']
"""

finditer匹配

import re
text = 'a1234aash34235235fdosdf'
p = re.compile('[0-9]+')
result = p.finditer(text)
print(result)
for r in result:
    print(r)
    print(r.group())
"""
<callable_iterator object at 0x7f26614d0210>
<re.Match object; span=(1, 5), match='1234'>
1234
<re.Match object; span=(9, 17), match='34235235'>
34235235
"""

sub替换

import re
text = 'a1234aash34235235fdosdf'
p = re.compile('[0-9]+')
result = p.sub('0', text)  # 把结果全部替换为0
print(result)
"""
a0aash0fdosdf
"""

group与groups的区别

import re
import requests
url = 'https://www.baidu.com'
headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)\
     Chrome/80.0.3987.149 Safari/537.36'
}
response = requests.get(url, headers=headers)
html = response.text
p = re.compile('<title>(.*?)</title>')  # 提取title中间的值
result = p.search(html)
print(result.group())
print(result.groups())
"""
<title>百度一下,你就知道</title>
('百度一下,你就知道',)
"""
import re
text = '2020-04-05'
p = re.compile('([0-9]{4})-([0-9]{2})')   # 这里分了两个组,一组提取年份,一组提取月份
result = p.search(text)
print(result)
print(result.group())  # 打印匹配值
print(result.groups())  # 打印匹配结果,返回一个tuple
print(result.group(0))  # 打印所有组,和group()一样
print(result.group(1))  # 打印第一组的匹配值
print(result.group(2))  # 打印第二组的匹配值
print(result.groups(0))  # 打印所有匹配结果,和groups一样的
import re
import requests
url = 'https://www.baidu.com'
headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)\
     Chrome/80.0.3987.149 Safari/537.36'
}
response = requests.get(url, headers=headers)
html = response.text
p = re.compile('<title>(.*?)</title>')  # 提取title中间的值
result = p.search(html)
print(result.group())
print(result.group(1))  # 把第1组的结果打印出来
print(result.groups())
"""
<title>百度一下,你就知道</title>
百度一下,你就知道
('百度一下,你就知道',)
"""

正则表达式修饰符

修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

re.I演示

import re
text1 = 'shdfi1234SHDFISHDI'
p = re.compile('[a-z]+', re.I)  # 不区分大小写,所有字母都匹配
result = p.findall(text1)
print(result)
"""
['shdfi', 'SHDFISHDI']
"""

re.M演示

import re
text1 = 'sh22dfi12\n34SHDFIssSHDI'
p = re.compile('^sh.*2$', re.M)  # 匹配多行,即忽略回车匹配所有小写字母
p2 = re.compile('^sh.*2$')
result = p.findall(text1)
result2 = p2.findall(text1)
print(result)
print(result2)
"""
['sh22dfi12']
[]
"""

re.S演示

import re
text1 = 'sh22dfi12\n34SHDFIssSHDI'
p1 = re.compile('d.*I')
p2 = re.compile('d.*I', re.S)  # 让点号也能匹配换行符
result1 = p1.search(text1)
result2 = p2.search(text1)
print(result1)  # 目前没有匹配上
print(result2.group())  # 从下面的结果来看换行符也被匹配上了
"""
None
dfi12
34SHDFIssSHDI
"""

匹配中文

贪婪匹配与非贪婪匹配

import re
text = '12ddd345'
# 匹配一个数字开头数字结尾的字符串
p1 = re.compile('[0-9].*[0-9]')  # 贪婪模式
p2 = re.compile('[0-9].*?[0-9]')  # 非贪婪模式
result1 = p1.search(text)
result2 = p2.search(text)
print(result1.group())
print(result2.group())
"""
12ddd345
12
"""
import re
text = u'123你好bbabd'
p1 = re.compile(u'[\u4e00-\u9fa5]{1,2}')  # 匹配一个或者两个中文
result1 = p1.search(text)
print(result1.group())  # 打印结果是匹配两个
"""
你好
"""
import re
text = u'123你好bbabd'
p1 = re.compile(u'[\u4e00-\u9fa5].*?')  # 匹配一个或者两个中文
result1 = p1.search(text)
print(result1.group())  # 打印结果是匹配一个
"""
你
"""
上一篇 下一篇

猜你喜欢

热点阅读