(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')]
.
所表示的任意字符不包括换行符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
search和findall默认匹配第一个左括号对应的内容linux
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')]
给定一个数字串,找出把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)) # [],多此一举
默认状况下,每一个左括号都对应一个group。使用非捕获组,可让左括号不参与组的计数。windows
import re s = "ABC" print(re.findall('(.((.).))', s)) # [('ABC', 'BC', 'B')] print(re.findall('(?:.((.).))', s)) # [('BC', 'B')] print(re.findall('(?:.(?:(.).))', s)) # ['B']
零宽断言一共有四种:(前+后)*(等+不等)数组
(?=X)
后面必须是X(?!X)
后面必须不是X(?<=X)
前面必须是X(?<!X)
前面必须不是X其中X能够是任意正则表达式。
有一个随机数字串,找出包含在0,1之间的数字串,要求:并发
0\d+1
这种形式import re s = "1023120513" print(re.findall("(?<=[^2]0)\d+?(?=1[^3])", s))
直接输出'23',零宽断言的好处在于:避免了经过group进一步摘取内容。线程
格式:(?imsx-imsx:Pattern)
例(1):(?i)ab(?-i)cd
可匹配abcd,Abcd,ABcd,aBcd
(?i)开启忽略大小写功能
(?-i)开启大小写敏感开关code
例(2):(?i:a)b
,可匹配ab和Ab
\d+?
可匹配尽可能少的\d,此即为非贪婪模式。
\d+
可匹配尽可能多的\d,这是默认状况下,此为贪婪模式
js获取正则表达式有以下两种方式:
获得的array是字符串数组,表示各个group,有两种获取分组的方式
regex.test(str)能够以bool值的形式获取str中是否包含regex。