python中常常使用正则表达式来帮助程序员建立一个符合自己想查找的模式,以帮助在文本中匹配想要的文本模式。
1.正则表达式匹配步骤:
(1)用import re来导入正则表达式的模块
(2)用re.compile()函数创建一个Regex对象。(使用原始字符串)
(3)向Regex对象的search()方法传入想查找的字符串,它返回一个Match对象
(4)调用Match对象的group()方法,返回实际匹配文本的字符串。
例如:
import re
phoneNumberRegex = re.compile(r'\d{3}-\d{3}-\d{4}')
mo1=phoneNumberRegex.search('my phone number is 010-123-4567')
mo1.group()
2.利用括号分组:
添加括号将在正则表达式中创建分组,正则表达式字符串中的第一对括号是第一组,第二对括号是第二组。向group()方法传入整数1或者2,可以得到匹配文本的不同部分。向group()方法传入0或不传入参数,将返回整个匹配的文本。
phoneNumberRegex = re.compile(r'(\d{3})-(\d{3})-(\d{4})')
mo1=phoneNumberRegex.search('my phone number is 010-123-4567')
mo1.group(1) ------>'010'
如果向以此获取所有分组,则使用groups()方法。groups()方法将会返回多个值的元组。
phoneNumberRegex = re.compile(r'(\d{3})-(\d{3})-(\d{4})')
mo1=phoneNumberRegex.search('my phone number is 010-123-4567')
mo1.groups() ------>('010','123','4567')
3.用‘|’匹配多个分组:
当希望匹配许多表达式中的一个时候,可以使用'|'来表示或者。如果多个表达式都出现在字符串中,则第一次出现的匹配文本将作为Match对象返回。
4.用'?'实现可选匹配:
?表示前面的分组在这个模式中是可选的,即该分组允许在该正则表达式匹配的文本中出现零次或者一次。
5.用'*'实现零次或多次匹配:
*表示其前面的分组可以在文本中出现零次或多次。
6.用'+'实现一次或多次匹配:
+表示其前面的分组至少在文本中出现一次。
7.用花括号匹配特定次数:
如果想要一个分组重复特定次数,则在正则表达式中该分组的后面,跟上花括号包围的数字。
除了一个数字,还可以指定一个范围,写下最大值和最小值,还可以只给定上限或者只给下限。
8.贪心策略:
python的正则表达式默认是贪心的,这表示在有二义的情况下,会尽可能匹配最长的字符串。
若在上面的花括号后加上?号,则会尽可能匹配最短的字符串。
9.findall()方法:
除了search()方法之外,Regex对象还有一个findall()方法,将返回一组字符串,包含被查找字符串中的所有匹配。
但是findall()方法不是返回一个Match对象,而是返回一个字符串列表。只要在正则表达式中没有分组,列表中的每个字符串都是一段被查找的文字。
如果在正则表达式中有分组,那么findall将返回元祖的列表,每个元组表示一个匹配,元组中的向则表示正则表达式中每个分组的匹配字符串。
10.字符分类:
常用字符分类的缩写:
\d:0到9的所有数字
\D:除了0到9的所有数字外的任何字符
\w:任何字母,数字或下划线字符
\W:除字母,数字或下划线字符外的任何字符
\s:空格,制表符或换行符
\S:除空格,制表符或换行符外的任何字符
还可以用方括号定义自己的字符分类。例如:[aeiouAEIOU]表示大小写元音字母
可以用短横表示字母或数字的范围。例如:[a-zA-Z]表示所有大小写字母
在方括号内不需要对符号进行转义。
在字符分类的左方括号后添加一个^可以得到“非字符类”,包含不再这个字符类中的所有字符。
11.在正则表达式开始处使用"^"表示匹配必须发生在被查找文本的开始。
使用$表示匹配必须发生在被查找文本的结尾。
12.通配符.的使用:
在正则表达式中,"."表示匹配除了换行之外的所有字符。要匹配"."则要转义
还可以用“.*”来匹配任意文本。
13.用sub()方法替换字符串:
Regex对象的sub()方法需要传入两个参数,第一个是一个字符串,用于取代发现的匹配,第二个是正则表达式。返回替换完成后的字符串。
有时候当需要使用匹配的文本本身,作为替换的一部分。在sub()的第一个参数中可以输入\1,\2,\3....表示再替换中输入分组1,2,3的文本
例如:
14.MORE
re.DOTALL作为re.compile()的第二个参数,可以使.字符匹配所有字符,包括换行字符。
re.IGNORECASE或re.I作为参数可以使正则表达式忽略大小写。
当使用'''多行字符串来作为正则表达式时,要传入re.VERBOSE