正则表达式进阶

1、分组

(A)((B)C)
各个group以下:
0 表示(A)((B)C),也就是匹配的所有
1 表示第一个左括号所包括的内容,即(A)
2 表示第二个左括号所包括的内容,即((B)C)
3 表示第三个左括号所包括的内容,即(B)javascript

import re
s="ABC"
res=re.findall('(.((.).))',s)
print(res) #[('ABC', 'BC', 'B')]

2、.所表示的任意字符不包括换行符

import re

s = """weiyinfu is great
haha yes
"""
x = re.search('is.*?yes', s)
print(x.group())

运行这段代码会报错,由于x为None,正则表达式最多匹配一行java

若是有回车符,显示会有问题
其实匹配正确,只是显示错误,这让人误觉得正则表达式写错了。
回车符的做用就是删除本行并把光标移动到行首,在windows下体现不出这一点,在linux下才能体现出来。python

import re

s = "weiyinfu is great \r haha yes"
x = re.search('is.*?yes', s)
print(x.group())#输出为 haha yes

3、脱壳处理

search和findall默认匹配第一个左括号对应的内容linux

  • 若是正则表达式中仅有一对括号,那么直接返回这对括号内的内容,也就是直接返回一个字符串
  • 若是正则表达式中包含多对括号,那么返回一个字符串元组
  • Python中的正则表达式会自动把仅包含一个字符串的元组改写为字符串类型,此操做称之为脱壳
import re

s = "11321323"
res = re.findall('(\d+?)2', s)  # ['113', '13']
print(res)
print(re.search("(\d+?)2", s).groups())  # ('113',)
print(re.search("(\d+?)2", s).group(0))  # 1132
print(re.findall("((\d+?)2)", s))  # [('1132', '113'), ('132', '13')]
print(re.findall("((\d+?))2", s))  # [('113', '113'), ('13', '13')]

3、反向引用

给定一个数字串,找出把2夹在中间的所有数字,例如323,121等。正则表达式

import re

s = "11321323"
print(re.findall('(\d)2\\1', s))  # ['3']
print(re.findall(r'(\d)2\1', s))  # ['3']
print(re.findall(r'(\d)2\\1', s))  # [],多此一举

4、非捕获组

默认状况下,每一个左括号都对应一个group。使用非捕获组,可让左括号不参与组的计数。windows

import re

s = "ABC"
print(re.findall('(.((.).))', s))  # [('ABC', 'BC', 'B')]
print(re.findall('(?:.((.).))', s))  # [('BC', 'B')]
print(re.findall('(?:.(?:(.).))', s))  # ['B']

5、零宽断言

零宽断言一共有四种:(前+后)*(等+不等)数组

  • (?=X) 后面必须是X
  • (?!X) 后面必须不是X
  • (?<=X) 前面必须是X
  • (?<!X) 前面必须不是X

其中X能够是任意正则表达式。
有一个随机数字串,找出包含在0,1之间的数字串,要求:并发

  1. 0前面不能是2
  2. 1后面不能是3
  3. 0、1之间指0\d+1这种形式
import re

s = "1023120513"
print(re.findall("(?<=[^2]0)\d+?(?=1[^3])", s))

直接输出'23',零宽断言的好处在于:避免了经过group进一步摘取内容。线程

6、模式开关

格式:(?imsx-imsx:Pattern)
例(1):(?i)ab(?-i)cd可匹配abcd,Abcd,ABcd,aBcd
(?i)开启忽略大小写功能
(?-i)开启大小写敏感开关code

例(2):(?i:a)b,可匹配ab和Ab

7、贪婪模式和非贪婪模式

\d+?可匹配尽可能少的\d,此即为非贪婪模式。
\d+可匹配尽可能多的\d,这是默认状况下,此为贪婪模式

8、JavaScript中的正则表达式

js获取正则表达式有以下两种方式:

  • array=str.match(regex)
  • array=regex.exec(str)

获得的array是字符串数组,表示各个group,有两种获取分组的方式

  • array[0],array[1],这是推荐方式
  • RegExp.$1,RegExp.$2,经过全局变量来获取,这种方式正常运行的前提是:JavaScript是单线程的,不会出现并发冲突。这种方式应该尽可能避免使用。

regex.test(str)能够以bool值的形式获取str中是否包含regex。