python正则表达式(^ $ ( ) )(四)
起始位置 和单行,多行模式
^表示匹配文本的起始位置。
正则表达式可以设定单行模式和多行模式
如果是单行模式,表示匹配整个文本的开头位置
如果是多行模式,表示匹配文本每行的开头位置
比如,下面的文本中,每行最前面的数字表示水果的编号,最后的数字表示价格
001-苹果价格-60, 002-橙子价格-70, 003-香蕉价格-80,
如果我们要提取所有的水果编号,用这样的正则表达式 ^\d+
用python代码展示单行模式:
content='''001-苹果价格-60, 002-橙子价格-70, 003-香蕉价格-80,''' import re p=re.compile(r'^\d+') for one in p.findall(content): print(one) ''' 输出结果:001 '''
默认为单行模式,所以只输入001
用python代码展示多行模式:
content='''001-苹果价格-60, 002-橙子价格-70, 003-香蕉价格-80,''' import re p=re.compile(r'^\d+',re.M) for one in p.findall(content): print(one) ''' 输出结果: 001 002 003 '''
注意:compile的第二个参数re.M,指明了使用多行模式,若不加re.M,表示单行模式,^只会匹配整个文本的开头位置
$表示匹配文本的结束位置
如果是单行模式,表示匹配整个文本的结束位置
如果是多行模式,表示匹配文本每行的结束位置
比如,下面的文本中,每行最前面的数字表示水果的编号,最后的数字表示价格
001-苹果价格-60 002-橙子价格-70 003-香蕉价格-80
如果我们要提取所有的水果价格,用这样的正则表达式 ^\d+$
用python代码展示单行模式:
content='''001-苹果价格-60 002-橙子价格-70 003-香蕉价格-80''' import re p=re.compile(r'\d+$') for one in p.findall(content): print(one) ''' 输出结果: 80 '''
用python代码展示多行模式:
content='''001-苹果价格-60 002-橙子价格-70 003-香蕉价格-80''' import re p=re.compile(r'\d+$',re.M) for one in p.findall(content): print(one) ''' 输出结果: 60 70 80 '''
括号-组选择
括号称之为 正则表达式的组选择,是从正则表达式匹配的内容里面扣取出其中的某些部分
前面,我们有个例子,从下面的文本中,选中每行逗号前面的字符串,也包括逗号本身
苹果,苹果是绿色的 橙子,橙子是橙色的 香蕉,香蕉是黄色的
就可以这样写正则表达式 ^.*,
但是,如果我们要求不要包括逗号呢?
当然不能直接这样写 ^.*
因为最后的逗号是特征所在,如果去掉它,就没法找逗号前面的了。
但是把逗号放在正则表达式中,又会包含逗号
解决问题的方法就是使用组选择符:括号
我们这样写 ^(.*), ,结果如下
我们把要从整个表达式中提取的部分放在括号中,这样水果的名字就被单独的放在 组group中了
对应的python代码如下:
content='''苹果,苹果是绿色的 橙子,橙子是橙色的 香蕉,香蕉是黄色的 ''' import re p=re.compile(r'^(.*),',re.MULTILINE) for one in p.findall(content): print(one) ''' 输出结果: 苹果 橙子 香蕉 '''
python代码实现:
content='''苹果,苹果是绿色的 橙子,橙子是橙色的 香蕉,香蕉是黄色的 ''' import re p=re.compile(r'^(.*)(,)',re.MULTILINE) for one in p.findall(content): print(one) ''' 输出结果: ('苹果', ',') ('橙子', ',') ('香蕉', ',') '''
python代码实现:
content='''张三,手机号码15945678901 李四,手机号码13945677701 王二,手机号码13845666901 ''' import re p=re.compile(r'^(.+),.+(\d{11})',re.MULTILINE) for one in p.findall(content): print(one) ''' 输出结果: ('张三', '15945678901') ('李四', '13945677701') ('王二', '13845666901') '''