正则表达式

正则表达式

一、正则表达式查找文本模式

正则表达式,简称Regex,是文本模式的表述方法。比如,\d是一个正则表达式,表示一位数字字符,即任何一位0到9的数字。

1、创建正则表达式对象

Python中所有正则表达式的函数都在re模块中,在交互式环境中输入以下代码,导入该模块。

import re

re.compile()传入一个字符串值,表示正则表达式,它将返回一个Regex模式对象,要创建一个Regex对象来匹配电话号码模式,就在交互环境中输入以下代码,`

phonenumber = re.compile(r'\d\d\d\d-\d\d\d-\d\d\d\d')

2、匹配Regex对象

Regex对象的search()方法查找传入的字符串,寻找该正则表达式的所有匹配。如果在字符串中没有找到该正则表达式模式,search()方法将会返回None;如果找到的话就会返回一个match对象。而且Match对象有一个group()方法,它返回被查找字符串中实际匹配的文本。

import re
ring = 'My phone number is 0371-123-2233'
phonenumber = re.compile(r'\d\d\d\d-\d\d\d-\d\d\d\d')
mo = phonenumber.search(ring)
print('phone number found:' + mo.group())

输出结果:

[Running] python -u "e:\vscode_py\.vscode\hello.py"
phone number found:0371-123-2233

[Done] exited with code=0 in 0.094 seconds

二、正则表达式匹配更多模式

1、括号分组

添加括号将在正则表达式中创建“分组”,(\d\d\d)-(\d\d\d-\d\d\d\d),然后在使用group()匹配对象方法,从一个分组中获取匹配的文本。正则表达式字符串中的第一对括号是第一组,第二对括号是第2组,在group()中匹配对象方法传入整数1或2,就可以匹配到文本的不同部分;在不传入任何参数或者参数为0时,将会返回整个文本。

[Running] python -u "e:\vscode_py\.vscode\hello.py"
0371
123-2233
0371-123-2233

[Done] exited with code=0 in 0.103 seconds

2、用管道匹配多个分组

字符 | 称为管道,正则表达式r'Ironman|Batman'将匹配'Ironman''Batman',但如果二者都出现在表达式中,则第一次出现的将作为Match对象返回。

hero = re.compile(r'Ironman|Batman')
mo1 = hero.search('Ironman and Batman')
print(mo1.group())
mo2 = hero.search('Batman is a hero')
print(mo2.group())

输出结果:

[Running] python -u "e:\vscode_py\.vscode\hello.py"
Ironman
Batman

[Done] exited with code=0 in 0.138 seconds

3、用问号实现可选匹配

字符 表明此匹配在表达式中是可选的。

hero = re.compile(r'Iron(wo)?man')
mo = hero.search('My favorate hero is Ironwoman')
print(mo.group())

表达式中(wo)?表明,模式 wo 是可选的分组,在该表达式匹配的文本中,wo出现的次数为 0次或1次,所以可以匹配到 Ironwoman
在匹配电话号码的代码中就可以修改为使用问好的匹配方式,如下代码所示:

ring = 'My phone number is 0371-123-2233'
ring1 = 'My phone number is 123-2233'
phonenumber = re.compile(r'(\d\d\d\d-)?\d\d\d-\d\d\d\d')
mo = phonenumber.search(ring)
mo1 = phonenumber.search(ring1)
print(mo.group())
print(mo1.group())

输出结果如下:

[Running] python -u "e:\vscode_py\.vscode\hello.py"0371-123-2233123-2233[Done] exited with code=0 in 0.123 seconds

3、用星号匹配0次或多次

星号 * 意味着’匹配零次或多次‘,即星号之前的分组可以在文本中出现任意次

hero = re.compile(r'Iron(wo)*man')mo1 = hero.search('Ironman and Batman')print(mo1.group())mo = hero.search('My favorate hero is Ironwowowowoman')print(mo.group())

输出结果:

[Running] python -u "e:\vscode_py\.vscode\hello.py"IronmanIronwowowowoman[Done] exited with code=0 in 0.111 seconds

Ironwoman表达式中的(wo)*部分匹配wo的零次,Ironwowowowoman匹配wo的多次个例。

4、用加号匹配一次或多次

*表示匹配零次或多次+表示匹配一次或多次,即字符串中至少有一次分组出现。

hero = re.compile(r'Iron(wo)+man')mo1 = hero.search('Ironman and Batman')if mo1 == None:    print('None')mo = hero.search('My favorate hero is Ironwowowowoman')print(mo.group())

输出结果:

[Running] python -u "e:\vscode_py\.vscode\hello.py"
None
Ironwowowowoman

[Done] exited with code=0 in 0.089 seconds

5、用花括号匹配特定次数

如果想要一个分组重复特定的次数,就在正则表达式中该分组的后面加上花括号包围的数字。例如,(wo){2}将匹配字符串”wowo”;
除此之外,还可以指定一个范围,即在花括号中写下一个最小值、一个逗号和一个最大值,例如,(wo){2,4}将匹配字符串”wowo”、”wowowo”和”wowowowo”;
当然,也可以不写花括号的第一个或第二个数字,即不限定最小、最大值。

hero = re.compile(r'Iron(wo){3,5}man')
mo1 = hero.search('Ironwowoman and Batman')
if mo1 == None:
    print('None')
mo = hero.search('My favorate hero is Ironwowowowoman')
print(mo.group())

输出结果:

[Running] python -u "e:\vscode_py\.vscode\hello.py"
None
Ironwowowowoman

[Done] exited with code=0 in 0.097 seconds
Donate comment here
------------- End Thank You For Your Reading -------------