07模式匹配正则表达式

创建正则表达式对象

import re

正则表达式:regular expression,缩写是regex。
本章最后会有让你自动摘取文本中的电话号码和邮箱地址。

常用匹配语法

re.match 从头开始匹配

re.search 匹配包含

re.findall 把所有匹配到的字符放到以列表中的元素返回

re.splitall 以匹配到的字符当做列表分隔符

re.sub 匹配字符并替换

re.compile(r'(ddd)-(ddd-dddd)')  创建匹配对象

美洲杯赌球,1.用正则表达式来寻找合适的电话号码:

常用正则表达式符号

. 默认匹配除n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行

^ 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r”^a”,”nabcneee”,flag=re.MULTILINE)

$ 匹配字符串结尾,或e.search(”foo$”,”bfoonnsdfsf”,flags=re.MULTILINE).group()也可以

* 匹配*号前的字符0次或多次,re.findall(“ab*”,”cabb3abcbbac”) 结果为[‘abb’,’ab’,’a’]

  • 匹配前一个字符1次或多次,re.findall("ab ","ab cd abb bba")       ['ab', 'abb']

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

{m}匹配前一个字符m次 re.findall("b{3}","ab cd abbb bba") ['bbb']

{n,m} 匹配前一个字符n到m次 re.findall("b{1,2}","ab cd abbb bba") ['b', 'bb', 'b', 'bb'] 后边加问好是匹配最少 不加则是最多

| 匹配|左或|右的字符 re.findall("b|c","ab cd abbb bba") ['b', 'c', 'b', 'b', 'b', 'b', 'b']

(...)分组匹配

A 只从字符开头匹配

Z 匹配字符结尾 同$

d 匹配数字0-9

D 匹配非数字

w 匹配[A-Za-z0-9]

W匹配非[A-Za-z0-9]

s 匹配空白字符。t n r

S匹配除了空白字符。t n r

 (?P<name>…)分组匹配

三个发展阶段
用def定义函数—ddd-dddd-ddd—d{3}-d{4}-d{3}
其中d代表数字0-9,就不需要再使用def再去筛选是否是数字了。
{ }在此表示,匹配之前的模式相对应的次数。

匹配实例

2.所有python中的regex在re中,所以要先import re

1.创建匹配对象compile()方法

import re
a = re.compile(r'd ')
a1 = a.search('gfd12341ahvcnxjbkafa')
print(a1.group())      # .group()直接输出结果,而不是返回对象

结果

12341

正则表达式
phoneNumRegex = re.compile(r'ddd-ddd-dddd')
#这里的compile是什么意思?此句代表建立一个正则表达式。
mo = phoneNumRegex.search('My number is 415-555-4242.')
#这里的search指要搜索的对象,如果搜索不到对象则会返回none。
print('Phone number found: ' mo.group())
#这里的group指对答案的集合???他明明不是集合为什么要用group

2.从头开始匹配 match()方法

import re
a = re.match("^w. ", "wdasfdsafdsa1223fdssfd33311")
b = re.match("^[a-z] ", "wdasfdsafdsa1223fdssfd33311")
c = re.search("R[a-zA-z] a", "wdasfdsafdsa1223fdssfd33311")
print(a)
print(b)
print(c)

结果如下

<_sre.SRE_Match object; span=(0, 27), match='wdasfdsafdsa1223fdssfd33311'>
<_sre.SRE_Match object; span=(0, 12), match='wdasfdsafdsa'>
None

正则表达式的更多模式匹配

group模式
例如要将电话里的前半部分和后半部门分开来找,在此group(1)代表第一个(里的部分),group(0)和group()一样,都代表输出整个。groups()代表分别输出()里的内容并且按照格式。
phoneNumRegex = re.compile(r'(ddd)-(ddd-dddd)')
mo = phoneNumRegex.search('My number is 415-555-4242.')
mo.group(1)
'415'
mo.group(2)
'555-4242'
mo.group(0)
'415-555-4242'
mo.group()
'415-555-4242'
mo.groups()
('415', '555-4242')
areaCode, mainNumber = mo.groups()
print(areaCode)
415
print(mainNumber)
555-4242

3.匹配包含search()方法

import re
a = re.search("[a-z] ","abcdefg12345")

print(a.group())

结果如下

abcdefg

PIPE管道模式

匹配多个正则表达式的时候可以用|连接,匹配到的第一个合适的内容会被输出,之后的就不会有输出了。

正则表达式如何输出多个结果?使用findall

用问号标记随机匹配的正则表达式
问号前的东西可以有也可以没有。

batRegex = re.compile(r'Bat(wo)?man')
mo1 = batRegex.search('The Adventures of Batman')
mo1.group()
'Batman'

mo2 = batRegex.search('The Adventures of Batwoman')
mo2.group()
'Batwoman'

用*匹配0或更多该内容的正则表达式

batRegex = re.compile(r'Bat(wo)*man')
mo1 = batRegex.search('The Adventures of Batman')
mo1.group()
'Batman'

mo2 = batRegex.search('The Adventures of Batwoman')
mo2.group()
'Batwoman'

mo3 = batRegex.search('The Adventures of Batwowowowoman')
mo3.group()

用 匹配1个或以上的标记内容的正则表达式

batRegex = re.compile(r'Bat(wo) man')
mo1 = batRegex.search('The Adventures of Batwoman')
mo1.group()
'Batwoman'

mo2 = batRegex.search('The Adventures of Batwowowowoman')
mo2.group()
'Batwowowowoman'

mo3 = batRegex.search('The Adventures of Batman')
mo3 == None
True

用{ }匹配的特定重复的内容

比如匹配(ha){3},就是指匹配hahaha;
比如(ha){3,5},就是匹配3-5个ha
比如(ha){3,}匹配3个以及无限多的ha

但有个问题,在使用{3,5}时,匹配的结果总是出现5个ha的那个,这是因为系统的greedy,如果要让系统non-greedy(在此的意思就是输出的是3个ha的那种),需要变成另外一种格式,就是在{ }加上?。
注意,这边的?和(ha)?中的这个意义是不同的。

4.管道匹配多个分组 |

import re
hero = re.compile(r'ABC|DEF')
m1 = hero.search('ABC hehe ABC')
print(m1.group())
m2 = hero.search('DEF hehe ABC')
print(m2.group())

结果如下

ABC
DEF

findall

  • 在使用re.compile search时,出现的结果都只有一个匹配项,如果想让所有匹配项都出现,需要用到findall。
  • 使用的时候不能再用group了,因为findall结果将会以列表的形势出现。
  • 要陈列匹配结果的时候,需要将原来的search改成findall。
  • 如果用findall,正则表达式中那个匹配公式是没有group的。

5.分组匹配 () 和group()

import re

phoneNum = re.compile(r'(ddd)-(ddd-dddd)')
mo = phoneNum.search('my number is 415-555-4242')
print(mo.group(1))          #输出第一个组
print(mo.group(2))          #输出第二个组
print(mo.group(0))          #输出所有
print(mo.group())            #输出所有

结果

415
555-4242
415-555-4242
415-555-4242

正则表达式中的代表字符缩写和其意义

Shorthand character class Represents
d Any numeric digit from 0 to 9.
D Any character that is not a numeric digit from 0 to 9.
w Any letter, numeric digit, or the underscore character. (Think of this as matching “word” characters.)
W Any character that is not a letter, numeric digit, or the underscore character.
s Any space, tab, or newline character. (Think of this as matching “space” characters.)
S Any character that is not a space, tab, or newline.

6.用问号实现可选匹配

import re
b = re.compile(r'Bat(wo)?man')
mo = b.search('The Adventures of Batman')
print(mo.group())
mo1 = b.search('The Adventures of Batwoman')
print(mo1.group())

结果

Batman

Batwoman

我们也可以自己做正则表达式的搜索范围,用[ ]中的内容表示

比如[a-z]代表所有的小写字母。如果将放在a的前面[a-z],代表是后面的反义词,代表只匹配除了[]里的其他内容。

本文由美洲杯赌球发布于计算机教程,转载请注明出处:07模式匹配正则表达式

TAG标签: 美洲杯赌球
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。