📅  最后修改于: 2020-04-15 07:09:42             🧑  作者: Mango
模块正则表达式(RE)指定与其匹配的一组字符串(模式)。
为了理解RE的类比,MetaCharacter是有用的,重要的,并且将在模块re的功能中使用。
一共有14个元字符,将在功能中进行讨论:
[] 代表字符类
^ 匹配开始
$ 匹配结束
. 匹配除换行符以外的任何字符
? 匹配零个或一个匹配项。
| 表示或
* 任意次数(包括0次)
+ 一处或多处
{} 指示先前RE的出现次数.
() 封装一组RE
函数compile()将正则表达式编译成模式对象,该对象具有用于各种操作的方法,例如搜索模式匹配或执行字符串替换。
# 使用__import __()导入模块正则表达式。
import re
# compile()创建正则表达式字符类[a-e],等效于[abcde].
# class [abcde] will match with string with 'a', 'b', 'c', 'd', 'e'.
p = re.compile('[a-e]')
# findall()搜索正则表达式,并在找到后返回一个列表
print(p.findall("Aye, said Mr. Gibenson Stark"))
输出:
['e','a','d','b','e','a']
了解输出:
第一次出现是“ Aye”中的“ e”,而不是“ A”,因为它区分大小写。
下一个出现是“ said”中的“ a”,然后是“ said”中的“ d”,然后是“ Gibenson”中的“ b”和“ e”,最后一个“ a”与“ Stark”匹配。
元字符黑斜线“ \”具有非常重要的作用,因为它发出各种序列的信号。如果要使用没有特殊含义的反斜杠作为元字符,请使用“ \\”
\d 匹配任意十进制数字
到设定的类别[0-9].
\D 匹配任何非数字字符.
\s 匹配任何空白字符.
\S 匹配任何非空白字符
\w 匹配任何字母数字字符,这
等效于类[a-zA-Z0-9_].
\W 匹配任何非字母数字字符.
设置类[\s ,.], 将与任何空格字符.
import re
# \d等效于[0-9]。
p = re.compile('\d')
print(p.findall("I went to him at 11 A.M. on 4th July 1886"))
# \d +将匹配[0-9]上的一个或多个或更大的一组
p = re.compile('\d+')
print(p.findall("I went to him at 11 A.M. on 4th July 1886"))
输出:
['1','1','4','1','8','8','6']
['11','4','1886']
import re
# \w等效于[a-zA-Z0-9_]。
p = re.compile('\w')
print(p.findall("He said * in some_lang."))
# \w +匹配字母数字字符组.
p = re.compile('\w+')
print(p.findall("I went to him at 11 A.M., he said *** in some_language."))
# \W匹配非字母数字字符。
p = re.compile('\W')
print(p.findall("he said *** in some_language."))
输出:
['H', 'e', 's', 'a', 'i', 'd', 'i', 'n', 's', 'o', 'm', 'e', '_', 'l', 'a', 'n', 'g']
['I', 'went', 'to', 'him', 'at', '11', 'A', 'M', 'he', 'said', 'in', 'some_language']
[' ', ' ', '*', '*', '*', ' ', ' ', '.']
import re
p = re.compile('ab*')
print(p.findall("ababbaabbb"))
输出:
['ab','abb','a','abbb']
re.split(pattern, string, maxsplit=0, flags=0)
第一个参数pattern表示正则表达式,string是将在其中搜索pattern并进行拆分的给定字符串,如果未提供maxsplit,则将其视为零“ 0″,如果提供任何非零值,则最多会发生许多分裂。如果maxsplit = 1,则该字符串将仅拆分一次,从而产生一个长度为2的列表。这些标志非常有用,可以帮助缩短代码,它们不是必需的参数,例如:flags = re.IGNORECASE,在此拆分中,大小写将被忽略。
from re import split
# '\W +'表示非字母数字字符或字符组
# 找到',' 或空格''后,split()将从该点开始拆分字符串
print(split('\W+', 'Words, words , Words'))
print(split('\W+', "Word's words Words"))
# 这里的':',''','不是AlphaNumeric,因此发生分裂的点
print(split('\W+', 'On 12th Jan 2016, at 11:02 AM'))
# '\d +'表示数字字符或字符组
# Splitting occurs at '12', '2016', '11', '02' only
print(split('\d+', 'On 12th Jan 2016, at 11:02 AM'))
输出:
['Words', 'words', 'Words']
['Word', 's', 'words', 'Words']
['On', '12th', 'Jan', '2016', 'at', '11', '02', 'AM']
['On ', 'th Jan ', ', at ', ':', ' AM']
例子:
import re
# 拆分仅发生一次,在“12"处,返回列表的长度为2
print(re.split('\d+', 'On 12th Jan 2016, at 11:02 AM', 1))
# 当flags = re.IGNORECASE时,将'Boy'和'boy'视为相同
print(re.split('[a-f]+', 'Aey, Boy oh boy, come here', flags = re.IGNORECASE))
print(re.split('[a-f]+', 'Aey, Boy oh boy, come here'))
输出:
['On','thth 2016,at 11:02 AM']
['','y,','oy oh','oy,','om','h','r','']
['A','y,Boy oh','oy,','om','h','r','']
re.sub(pattern, repl, string, count=0, flags=0)
函数中的“ sub”代表SubString,在给定的字符串(第3个参数)中搜索某个正则表达式模式,并在找到子字符串模式后将其替换为repl(第2个参数),计数检查并保持次数发生这种情况。
import re
# 正则表达式模式“ ub"与“Subject"和“Uber"处的字符串匹配。
# 由于CASE已被忽略,因此使用Flag时,“ ub"应与字符串匹配两次
# 匹配后,在“Subject"中将“ ub"替换为“〜*",在“ Uber"中将替换“ Ub".
print(re.sub('ub', '~*' , 'Subject has Uber booked already', flags = re.IGNORECASE))
# 考虑到“ Uber"中的区分大小写,“ Ub"将不再生效
print(re.sub('ub', '~*' , 'Subject has Uber booked already'))
# 由于给定的计数值为1,因此更换的最大次数为1
print(re.sub('ub', '~*' , 'Subject has Uber booked already', count=1, flags = re.IGNORECASE))
# 模式前面的'r'表示RE,\s表示字符串的开始和结尾。
print(re.sub(r'\sAND\s', ' & ', 'Baked Beans And Spam', flags=re.IGNORECASE))
输出:
S~*ject has ~*er booked already
S~*ject has Uber booked already
S~*ject has Uber booked already
Baked Beans & Spam
函数subn()
语法:
re.subn(pattern, repl, string, count=0, flags=0)
subn()在所有方面都类似于sub(),但其提供输出的方式不同。它返回一个元组,其中包含替换和新字符串的总数,而不仅仅是字符串。
import re
print(re.subn('ub', '~*' , 'Subject has Uber booked already'))
t = re.subn('ub', '~*' , 'Subject has Uber booked already', flags = re.IGNORECASE)
print(t)
print(len(t))
# 这将产生与sub()相同的输出
print(t[0])
输出:
('S~*ject has Uber booked already', 1)
('S~*ject has ~*er booked already', 2)
Length of Tuple is: 2
S~*ject has ~*er booked already
函数escape()
语法:
re.escape(string)
返回所有非字母数字加反斜杠的字符串,如果您要匹配其中可能包含正则表达式元字符的任意文字字符串,则此方法很有用
import re
# escape()在每个非字母数字字符之前返回带有反斜杠“\"的字符串
# 在第一种情况下,仅''不是字母数字
# 在第二种情况下,'',脱字符'^','-','[]','\'不是字母数字
print(re.escape("This is Awseome even 1 AM"))
print(re.escape("I Asked what is this [a-9], he said \t ^WoW"))
输出:
This\ is\ Awseome\ even\ 1\ AM
I\ Asked\ what\ is\ this\ \[a\-9\]\,\ he\ said\ \ \ \^WoW/* Your code... */