python正则取反,Python正则表达式

好久没复习Python了,感觉很多东西都快忘了,趁着假期赶紧补一补基础

什么是正则

正则表达式使用单个字符串来描述,匹配一系列符合某个句法规则的字符串,简单理解,就是对字符串的检索匹配和处理

Python 正则表达式

Python通过re模块提供对正则表达式的支持

1.先将正则表达式的字符串形式编译为Pattern实例;

2.使用Pattern实例处理文本并获得匹配结果;

3.使用实例获得信息,进行其他的操作。

先熟知几个re模块常用的函数:

(1)re.compile(pattern,flags=0)

​ re.match(pattern,string,flags=0)

来看下面一个例子:

1

2

3

4

5>>>import re

>>>pattern = re.compile('hello')

>>>match = pattern.match('hello world')

>>>print(match.group())

hello

这个例子使用了re模块的compile函数生成一个正则表达式的pattern对象,该对象拥有一系列方法用于正则表达式的匹配和替换,简单而言就是规定了匹配的模式,而match函数则用来匹配,匹配成功则返回一个match对象,match对象通过group()返回被RE匹配的字符串

(2)re.findall(pattern,string,flags=0)

来看下面一个例子:

1

2

3>>>import re

>>>re.findall('hello','hello world')

['hello']

这个例子使用了re模块的findall函数遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表,跟compile函数不同在于,findall函数能搜素出所有符合的字符串组成一个列表

(3)re.search(pattern,string,flags=0)

来看下面一个例子:

1

2

3

4>>>import re

>>>match = re.search('hello','hello world')

>>>match.group()

'hello'

这个例子使用了re模块的search函数,跟match函数一样,只找到第一个匹配的字符串然后返回一个match对象

实例

抓取i春秋网页的课程信息

python正则取反,Python正则表达式_第1张图片

代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48import requests

import re

from bs4 import BeautifulSoup

url="https://www.ichunqiu.com/courses/webaq"

header={

'Host': 'www.ichunqiu.com',

'Connection': 'close',

'Cache-Control': 'max-age=0',

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36',

'Upgrade-Insecure-Requests': '1',

'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',

'Accept-Encoding': 'gzip, deflate',

'Accept-Language': 'zh-CN,zh;q=0.9'

}

r=requests.get(url,headers=header)

r.encoding=r.apparent_encoding

soup=BeautifulSoup(r.text,'html.parser')

#获取课程名称

classname=[]

l=soup.find_all('div',class_='coursename')

for i in l:

classname.append(i['title'])

#获取课程价格

cost=re.findall(r'\d*元|免费',str(soup))

#获取课程课时和总时间

time=re.findall(r'\d*课时\d*分钟',str(soup))

#获取课程学习人数

people=re.findall(r'\d*人学习',str(soup))

#整理课程所有信息

classMessage=[]

message=[]

for i in range(20):

message.append(classname[i])

message.append(cost[i])

message.append(time[i])

message.append(people[i])

classMessage.append(message)

message=[]

print('{0:30s}\t{1:8s}\t{2:15s}\t{3:15s}'.format('课程名称','价格','课时及总时间','学习人数',chr(12288)))

for i in classMessage:

print('{0:30s}\t{1:8s}\t{2:15s}\t{3:15s}'.format(i[0],i[1],i[2],i[3],chr(12288)))

print()

输出结果:

python正则取反,Python正则表达式_第2张图片

最后这里因为中文英文字符所占字节不同,所以死活对不齐…也利用了chr(12288)填充的办法还是行不通,希望有大神能告知如何解决,感激不尽

特殊字符一般字符

匹配自身

abc

abc

.

匹配任意换行符”\n”以外的字符

a.c

abc

\

转义字符,是最后一个字符改变原来的意思。用于在正则表达式中转义一些特殊字符

a\.c a\\c

a.c a\c

[…]

字符集。对应的位置可以是字符串集中任意1个字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c],第一个字符如果是^则表示取反,如[^abc]表示不是abc的其他字符。所有的特殊字符在字符集中都失去原来的特殊含义,在字符集中如果要使用],-或^,可以在前面加上反斜杠

a[bcd]e

abe ace ade

字符集预定义字符(可以写在[…]中)

含义

例子

符合匹配的例子

\d

数字:[0-9]

a\dc

a1c,a9c

\D

非数字:[^\d]

a\Dc

abc,a c

\s

空白字符:[\t\r\f\v]

a\sc

a c

\S

非空白字符:[^\s]

a\Sc

abc,a1c

\w

单词字符:[A-Za-z0-9]

a\wc

abc,a1c,aBc

\W

非单词字符:[^\w]

a\Wc

a c,a.c

数量词数量词

含义

例子

符合匹配的例子

*

匹配前一次字符0次或无限次

abc*

ab,abccc

+

匹配前一个字符1次或无限次

abc+

abc,abccc

?

匹配前一个字符0次或1次

abc?

ab,abc

{m}

匹配前一个字符m次

ab{2}c

abbc

{m,n}

匹配前一个字符m到n次

ab{1,2}c

abc,abbc

逻辑,分组字符

含义

例子

符合匹配的例子

或运算符

代表左右表达式任意匹配一个,它总是先尝试匹配左边的表达式,一旦成功匹配则跳过右边的表达式,如果或运算符没有包括在()中,则它的范围是整个正则表达式

abc或def

abc def

(…)

被括起来的表达式将作为分组,从表达式左边开始每遇到一个分组的左括号,编号+1分组表达式作为一个整体,可以后接数量词,表达式中或运算符仅在该组中有效

(abc){2} a(123或456)c

abcabc a123c,a456c

贪婪模式和非贪婪模式

正则表达式通常用于在文本中查找匹配的字符串。Python里的数量词默认是贪婪的,意思是总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。

例如:正则表达式”ab*“如果用于查找”abbbc”,将匹配到”abbb”。而如果使用非贪婪方法(在数量词后面加上?,则使用非贪婪方法匹配),如”ab*?”,将找到”a”

你可能感兴趣的:(python正则取反)