python正则一些简单匹配
元字符的使用re.findall(regex,string)
功能:在string字符串中,匹配regex正则表达式能够匹配的项,放到一个列表中返回
* 普通字符串
元字符 :abc
匹配规则 : 匹配字符串的值
匹配示例 :abc
In : re.findall('abc','abcdeabc')
Out: ['abc', 'abc']
* 使用“或”进行多个匹配
元字符: re1 | re2
匹配规则:既能匹配正则表达式re1所表达内容,也能匹配 re2所表达内容
匹配示例:ab | bc--》ab bc
In : re.findall('ab|de','abcdeabc')
Out: ['ab', 'de', 'ab']
* 点号"."
元字符: .
匹配规则:匹配任意一个字符
匹配示例:f.o ――》foo fao f@o
In : re.findall('f.o','foo,f@oabfabo')
Out: ['foo', 'f@o']
* 匹配开头子串
元字符:^
匹配规则:匹配一个字符串的开头位置
匹配示例:^From匹配以 From 开头的字符串起始部分
In : re.findall('^From','From China')
Out: ['From']
In : re.findall('^From','I come From China')
Out: []
*匹配字符串的结尾
元字符 :$
匹配规则 : 当一个字符串以什么结尾时使用$标记
匹配示例 : py$ -》匹配所有以py结尾的字符串
In : re.findall('py$','test.py')
Out: ['py']
In : re.findall('py$','python')
Out: []
* 匹配任意0个或多个字符
元字符 : *
匹配规则: 匹配前面出现的字符或正则表达式0次或者多次
匹配示例: ab* -> abbbbbbbb
In : re.findall('.*','askjdfh89w4234')
Out: ['askjdfh89w4234', '']
In : re.findall('.*','askjdfh89w4234sdfhhg')
Out: ['askjdfh89w4234sdfhhg', '']
In : re.findall('ab*','a')
Out: ['a']
In : re.findall('ab*','abbbb')
Out: ['abbbb']
*匹配任意1个或多个字符
元字符 : +
匹配规则: 匹配前面出现的字符或正则表达式1次或者多次
匹配示例: ab+ -> abbbbbbbb
In : re.findall('ab+','abbbb')
Out: ['abbbb']
In : re.findall('ab+','a')
Out: []
* 匹配字符 0 次或1次
元字符 :?
匹配规则:匹配前面出现的字符或正则表达式0次或1次
匹配示例: ab? --》 a或者ab
In : re.findall('ab?','a')
Out: ['a']
In : re.findall('ab?','ab')
Out: ['ab']
* 匹配前面的字符或re指定次数
元字符 : {N} N代表一个数字
匹配规则:匹配前面出现的字符或正则表达式N次
匹配示例: ab{3} --》 abbb
In : re.findall('ab{3}','abbbbbb')
Out: ['abbb']
In : re.findall('ab{3}','abb')
Out: []
* 匹配前面的字符或re指定次数
元字符 : {M,N} M,N代表数字
匹配规则:匹配前面出现的字符或正则表达式M 到 N次
匹配示例: ab{3,8} --》 abbbabbbbbbbb
In : re.findall('ab{3,8}','abbb')
Out: ['abbb']
In : re.findall('ab{3,8}','abbbbbbbbbbb')
Out: ['abbbbbbbb']
* 字符集合匹配
元字符 :
匹配规则: 匹配中括号中任意一个字符
匹配示例: bt -> batbbtbctbdt
In : re.findall('bt','bat,b1tba3t')
Out: ['bat', 'b1t']
In : re.findall('','acadbcbd')
Out: ['ac', 'ad', 'bc', 'bd']
* 字符集合匹配
元字符 :
匹配规则: 匹配中括号中任意一个区间内的字符
匹配示例: +匹配任意一个由字母数字组 In : re.findall('+','safd1324')
Out: ['safd1324']
In : re.findall('+','adf$&^%123')
Out: ['adf', '123']
成的非空字符串
* 字符集合不匹配
元字符 : [^...] ... 表示上面两项中任意内容
匹配规则: 匹配任意非中括号中的字符集
匹配示例: [^aeiou]匹配任意一个非aeiou字符
[^a-z]匹配任意一个非小写字母
In : re.findall('[^a-z]','abc1j2^&d')
Out: ['1', '2', '^', '&']
In : re.findall('[^aeiou]','hello world')
Out: ['h', 'l', 'l', ' ', 'w', 'r', 'l', 'd']
* 匹配(非)数字字符
元字符 : \d \D [^0-9]
匹配规则 : \d 匹配任意一个数字字符
\D 匹配任意一个非数字字符
匹配示例 :\d{3}-->'123'
In : re.findall('\d{3}','hello 1234')
Out: ['123']
In : re.findall('\D{3}','hello 1234')
Out: ['hel', 'lo ']
* 匹配(非)字母数字字符
元字符 : \w \W [^a-zA-Z0-9]
匹配规则 : \w 匹配任意一个字母或数字字符
\W 匹配任意一个非字母或数字字符
匹配示例 :\w{3}-->'a23'
In : re.findall('\w*','Hello World')
Out: ['Hello', 'World']
In : re.findall('\w+-\d+','xiaoming-56')
Out: ['xiaoming-56']
* 匹配(非)空字符
元字符 : \s(空格 \n\0\t\r) \S
匹配规则 : \s 匹配任意一个空字符
\S 匹配任意一个非空字符
匹配示例 :hello world-> hello world
In : re.findall('hello\s+world','hello world')
Out: ['hello world']
In : re.findall('\S*','helloworld&* ask')
Out: ['helloworld&*', '', 'ask', '']
In : re.findall('\s','a b c\n')
Out: [' ', ' ', '\n']
*匹配字符串开头和结尾
元字符\A(^)\Z ($)
匹配规则: \A 匹配字符串的开头位置
\Z 匹配字符串的结尾位置
匹配示例: \Aabc\Z ^abc$ - > abc
In : re.findall('\Aabc\Z','abcabc')
Out: []
In : re.findall('\Aabc\Z','abc')
Out: ['abc']
In : re.findall('efg\Z','hi,abcdefg')
Out: ['efg']
* 匹配(非)单词边界
元字符 : \b \B
匹配规则 : 将非字母的部分不认为是单词部分
将连续字母的部分认为是一个单词
匹配示例: “This is a %test%”
In : re.findall(r'\btest\b','This is a %test%')
Out: ['test']
In : re.findall(r'\bThis\b','This is a %test%')
Out: ['This']
In : re.findall(r'\bis\b','This is a %test%')
Out: ['is']
In : re.findall(r'\Bis\b','This is a %test%')
Out: ['is']
In : re.findall(r'is\b','This is a %test%')
Out: ['is', 'is']
元字符总结
字符 : 匹配实际字符
匹配单个字符:. [] \d\D\w \W\s\S
匹配重复次数: * + ?{}
匹配开头结尾: ^$\A\Z \b\B
其他 : | [^ ]
raw字串和转义
r“hello world” ->raw字串
raw字串特点 : 不进行转义解析
“hello \n world” -> \n表示换行
r"hello \n world" -> \n表示两个字符
什么时候加r
转为raw字符串是为了防止python对字符串的转义解析,所以在正则表达式本身有“\”的时候最好加上r
正则表达式的转义匹配
当匹配正则表达式内的特殊字符的时候,正则表达式本身也需要进行转义,如要匹配字符串中的 *则正则表达式应为“\*”
特殊字符如下:
\ *.?()[]{}""''
匹配字符串中的*
In : re.findall(r'\*','* is not \\, \\ is not ?')
Out: ['*']
In : re.findall('\\*','* is not \\, \\ is not ?')
Out: ['*']
匹配字符串中的“\”
In : re.findall('\\\\','* is not \\, \\ is not ?')
Out: ['\\', '\\']
In : re.findall(r'\\','* is not \\, \\ is not ?')
Out: ['\\', '\\']
贪婪和非贪婪
贪婪模式 : 不做处理的情况下,正则表达式默认是贪婪模式。即 在使用 * +?{M,N} 的时候尽可能多的向后进行匹配。
e.g.
ab*可以匹配 a ababbb... 那么当b足够多的时候它会尽可能多的去匹配
In : re.findall(r'ab*','abbbbbbb')
Out: ['abbbbbbb']
非贪婪模式:尽可能少的匹配复合正则条件的内容
贪婪模式 ---》 非贪婪模式 方法:后面加“?”
即 *? +? ??{M,N}?
In : re.findall(r'ab*?','abbbbbbb')
Out: ['a']
In : re.findall(r'ab+?','abbbbbbb')
Out: ['ab']
In : re.findall(r'ab??','abbbbbbb')
Out: ['a']
In : re.findall(r'ab{2,4}?','abbbbbbb')
Out: ['abb']
正则表达式分组
((ab)*(cd))
正则表达式 (ab)*cd
1. 正则表达式可以分组,分组的标志即括号(),每个括号都是正则表达式的一个子组,而每个子组是整体正则表达式的一部分,同时也是一个小的正则表达式
2. 当有多个子组的时候,我们从外层向内侧分别叫第一,第二....子组。当同一层次的时候,从左向右分别计数
3. 分组会该表* + ? {}的重复行为,即把每个分组当做一个整体对待,进行相应的重复操作
4. 当子组能后和多个目标字符串内容进行匹配时,只返回一个内容
In : re.findall(r'(ab)+cd','ababcdef')
Out: ['ab']
5.每个组都可以起名字,我们可以根据起的名字辨别各个组。
格式: (?P<word>hello)
给子组(hello) 起一个名字,这个名字是 “word”
子组通过名字进行调用 (?P=word)表示复制子组正则表达式内容
In : re.findall(r'((?P<word>hello)\s+(?P=word))','hello hello')
Out: [('hello hello', 'hello')]
页:
[1]