python爬虫中的正则表达式是不是困扰了你好久?

什么是正则表达式?

正则表达式是通过一些特殊的符号组成的字符串,这组字符串被称为模板;通过模板然后与目标串进行匹配,将与之相匹配的字符串取出。这就是正则表达式的作用

正则表达式的特殊字符

“ . ”符号可以匹配除换行符意外的任意一个字符

r = re.match(r'a.c', 'a你c').group()
print(r)
#a你c
r = re.match(r'a.c', 'aBc').group()
print(r)
#aBc
r = re.match(r'a.c', 'acc').group()
print(r)
#acc

“ | ”逻辑或字符

r = re.match(r'a|b', 'ab')
print(r)
#输出结果为:a
r = re.match(r'a|b', 'a')
print(r)
#输出结果为:a
r = re.match(r'a|b', 'b')
print(r)
#输出结果为:b
r = re.match(r'a|b', 'ba')
print(r)
#输出结果为:b

“ ^ ” 取反符号,对字符集取反

r = re.match(r'速度与激情[^12345678]', '速度与激情9')
print(r.group())
#输出结果为:速度与激情9

“ [] ” 匹配方括号中的一个字符

r = re.match(r'[abc]2', 'a2')
print(r.group())
#输出结果为:a2

“ – ”区间符号如a-z匹配a到z中的任意一个字符

r = re.match(r'速度与激情[1-8a-z]', '速度与激情a')
print(r.group())
#输出结果为:速度与激情a

“ ”对紧跟其后的一个字符进行转义

r = re.match(r'速度.激情[1-8a-z]', '速度.激情a')
print(r.group())
#输出结果为:速度.激情a

“ d ” 匹配0-9中的任意一个数字

# r = re.match(r'[d]*', '123')
# print(r.group())
#输出结果为为:123

“ D ”匹配除0-9数字之外的字符,相当于[^d]

r = re.match(r'速度与激情D', '速度与激情a')
print(r.group())
#输出结果为:速度与激情a

“ w ”匹配任意一个字符、数字、下划线

r = re.match(r'[w]*', 'hfi')
print(r.group())
#输出结果为:hfi

“ W ”匹配除数字、字符、下划线意外的任意,相当于[^w]

ptn = 'W-age'
lst = ['1-age', 'A-age', '!-age', '_-age']
r = re.match(ptn, lst[2])
print(r.group())
#输出结果为:!-age

“ s ”匹配制表符、空格、换行符等空白字符中的任意一个

r = re.match(r's', ' ')
print(r.group())
#输出结果为:" "
r = re.match(r's', '
')
print(r.group())
#输出结果为:" 
"
r = re.match(r's', '	')
print(r.group())
#输出结果为:"  "

“ S ”相当于s的取反操作,[^s]

ptn = 'pSy'
lst = ['p ysdf', 'pyyfdsfp yfds', 'p y', 'p_y']
r = re.match(ptn, lst[1])
print(r.group())
#输出结果为:pyy

“ {n} ”表达式重复n次,如d{2} == dd;a{3} = aaa

ptn = '[w]{6}'
lst = ['hello', 'python', '#$%^&', '123456']
r = re.match(ptn, lst[1])
print(r.group())
#输出结果为:python

“ {n,} “表达式至少重复n次,可以是无限次

ptn = '[w]{4,}'
lst = ['sdiu', '48246', 'fasdfhasoduhtfouasdhfuhasiufhw9iuhfoasdhfiuasdhfuasdhiu', 'fds']
for list in lst:
    r = re.match(ptn, list)
   print(r.group())
#输出结果为:
#sdiu
#48246
#fasdfhasoduhtfouasdhfuhasiufhw9iuhfoasdhfiuasdhfuasdhiu
#None

” {n,m} “表达式至少重复n次至多重复m次

ptn = '[w]{3,6}'
lst = ['hello', 'thang', '#$%^', '#$', '123456', '12_']
for list in lst:
    r = re.match(ptn, list)
print(r.group())
#输出结果为:
#hello
#thang
#None
#None
#123456
#12_

” ? “匹配表达式0次或1次

ptn = 'h[a-z]?'
lst = ['hello', 'abc', 'xxx', 'h']
for lt in lst:
    r = re.match(ptn, lt)
    print(r)
#输出结果为:
#<re.Match object; span=(0, 2), match='he'>
#None
#None
#<re.Match object; span=(0, 1), match='h'>

” + “表达式至少出现1次之多可以出现无限次

ptn = 'h[a-z]+'
lst = ['hello', 'abc', 'xxx', 'h']
for lt in lst:
    r = re.match(ptn,lt)
    print(r)
#输出结果为:
#<re.Match object; span=(0, 5), match='hello'>
#None
#None
#None

” * “表达式出现0次到无限次

ptn = 'h[a-z]*'
lst = ['hellofsadugfiusdahufhsdufhs', 'abc', 'xxx', 'h']
for lt in lst:
    r = re.match(ptn, lt)
    print(r)
#输出结果为:
#<re.Match object; span=(0, 27), match='hellofsadugfiusdahufhsdufhs'>
#None
#None
#<re.Match object; span=(0, 1), match='h'>

正则表达式的常用方法

match(pattern, string,flag=0)

match()是从头开始匹配的

pattern:是正则表达式,如果匹配成功返回一个match()对象,如果匹配失败返回None

第二个参数表示要匹配的字符

是标致位用于控制正则表达式的匹配方式:如,是否区分大小写,多行匹配

strA = ‘python’
str = ‘pythonnand java’
r = re.match(strA, str)
print®
print(r.group())
print(r.start())
print(r.end())
print(r.span())
#输出结果为:
<re.Match object; span=(0, 6), match=‘python’>
python
0
6
(0, 6)

compile(ptn, flag)

flag:

re.A ASCll匹配

re.I 匹配不区分大小写

re.S 可以换行匹配

  ptn = re.compile(r'abc', re.I)
  r = ptn.match('ABC123')
  print(r)
  #输出结果为:
  #<re.Match object; span=(0, 3), match='ABC'>

search()查找不用从文本开头开始

ptn = 'abc'
string = '123abc567abc789'
r = re.search(ptn, string)
print(r.group())
#输出结果为;
#abc

findall(ptn, str, flags)

ptn1 = 'abc'
ptn2 = 'ABC'
string = '123abc567abc789'
r = re.findall(ptn1,string)
print(r)
z = re.findall(ptn2,string)
print(z)
#输出结果为;
#['abc', 'abc']
#[]

split(ptn, str, maxsplit, flags)

r = re.findall(r'd{1,}', '8+7*5+6/3')#['8', '7', '5', '6', '3']
  print(r)
  #输出结果为:['8', '7', '5', '6', '3']
  r = re.split(r'[+*/]', '8+7*5+6/3')#['8', '7', '5', '6', '3']
  print(r)
  #输出结果为;['8', '7', '5', '6', '3']
  r = re.split(r'[+*/]', '8+7*5+6/3', maxsplit=2)#['8', '7', '5+6/3']
  print(r)
  #输出结果为:['8', '7', '5+6/3']

sub(oldstr, newstr, str[])

  s = 'i am thaqy i am nice to meet you ! i like python'
  r = re.sub(r'i', 'I', s)
  print(r)
  #输出结果为:I am thaqy I am nIce to meet you ! I lIke python

分组功能

分组就是在匹配到的数据中再次筛选

例如:

题目需求是匹配到88和55

text  = 'apple price is $88, orange price is $55'
r = re.search(r'.+($d+).+($d+)', text)
print(r.groups())
print(r.group(1))
print(r.group(2))
#输出结果为:
('$88', '$55')
$88
$55

位置匹配

" ^ "在字符串开始的地方匹配,符号本身不匹配任何字符

r = re.match(r'^abc', 'abcdef')
print(r.group())
#输出结果为:abc

" $ "在字符串结束的地方匹配,符号本身不匹配任何字符

r = re.match(r'a.c$', 'abc')
print(r.group())
#输出结果为:abc

贪婪匹配和非贪婪匹配

贪婪匹配

匹配

abc

r = re.match(r'<div>.*</div>', '<div>abc</div><div>bcd</div>')
print(r.group())
#输出结果为:<div>abc</div><div>bcd</div>

非贪婪匹配

r = re.match(r'<div>.*?</div>', '<div>abc</div><div>bcd</div>')
print(r.group())
#输出结果为:<div>abc</div>

来源:PY学习网:原文地址:https://www.py.cn/article.html

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » python爬虫中的正则表达式是不是困扰了你好久?