正则表达式(增强版)

前言: 由于在自己的项目中遇到了需要用到正则表达式的知识,并且自己在Google的时候发现了一些当初学习正则表达式的时候没有掌握的东西,故:再次补充一番

推荐一个正则表达式的web演示网址: 点击

  1. 字符串匹配函数

    re.match(reg, info)

    # reg为正则表达式 info则是目标字符串 匹配成功则返回match对象 否则返回none
    In [10]: demo = 'my demo file'
    
    In [11]: re.match(r'my', demo)
    
    Out[11]: <_sre.SRE_Match object; span=(0, 2), match='my'>

    re.search(reg, info)

    # search方法也一样需要两个参数,返回值也是一样,二者区别在于match方法是在info开始处匹配,而search从全体内容匹配,注意,如果字符串中包含多个reg子串,只返回第一个。
    In [21]: m = re.search(r'(\w+) (\w+)', demo)
    
    In [22]: m
    
    Out[22]: <_sre.SRE_Match object; span=(0, 7), match='my demo'>

这个match对象有很多方法和属性:

属性 说明
Pos 搜索的开始位置
Endpos 搜索的结束位置
String 搜索的字符串
Re 当前使用的正则表达式的对象
Lastindex 最后匹配的组索引
Lastgroup 最后匹配的组名
group(index=0) 某个分组的匹配结果。如果index等于0,便是匹配整个正则表达式
groups() 所有分组的匹配结果,每个分组的结果组成一个列表返回
Groupdict() 返回组名作为key,每个分组的匹配结果座位value的字典
start([group]) 获取组的开始位置
end([group]) 获取组的结束位置
span([group]) 获取组的开始和结束位置
expand(template) 使用组的匹配结果来替换模板template中的内容,并把替换后的字符串返回
具体分析:
In [34]: m.expand(r'1.\2这是一个测试')
Out[34]: '1.demo这是一个测试'
# 参数为一个字符串template,可以用正则表达式匹配到的分组 \1 \2 修改内容
其他的就很显而易见了,都在上表格。

re.findall(reg, info)

# 扫描info字符串,将匹配到的字符提取出来放入列表并且返回这个列表

re.fullmatch(reg, info)

# 扫描整个字符串,如果整个字符串都包含在reg的范围中,返回整个字符串,否则返回None,较少见!

re.finditer(reg ,info)

# 类似findall()只是返回的是迭代器
  1. 字符串拆分函数

re.split(reg, string, maxsplit=0, flags=0)

# 以下是官网的demo
# 很清晰的表达出这个方法的内容
# \w 是字母数字下划线 \W则是非字母数字下划线
>>> re.split(r'\W+', 'Words, words, words.')
['Words', 'words', 'words', '']

# 如果在模式中使用捕获括号,则模式中所有组的文本也会作为结果列表的一部分返回。
>>> re.split(r'(\W+)', 'Words, words, words.')
['Words', ', ', 'words', ', ', 'words', '.', '']

 # 如果maxsplit不为零,则最多出现maxsplit分裂,并且字符串的其余部分作为列表的最后一个元素返回。
>>> re.split(r'\W+', 'Words, words, words.', 1)
['Words', 'words, words.']
>>> re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE)
['0', '3', '9']

re.sub(reg, repl, string)

# 使用指定的字符串repl来替换目标字符串string中匹配正则表达式reg的字符

In [43]: demo
Out[43]: 'my demo file'

In [44]: re.sub(r'm\w', 'OO', demo)
Out[44]: 'OO deOO file'
  1. 正则表达式:分组
分组 描述
(expression) 使用圆括号直接分组;正则表达式本身匹配的结果就是一个组,可以通过group()或者group(0)获取;然后正则表达式中包含的圆括号就是按照顺序从1开始编号的小组
(?Pexpression) 使用圆括号分组,然后给当前的圆括号表示的小组命名为name,可以通过group(name)进行数据的获取
In [47]: phoneNumber = '110-120130'

In [48]: result = re.search(r'(\d{3})-(\d{6})', phoneNumber)

In [49]: result.groups()
Out[49]: ('110', '120130')

In [50]: result.group(1)
Out[50]: '110'

In [51]: result.group(2)
Out[51]: '120130'

In [52]: result = re.search(r'(?P<first>\d{3})-(?P<second>\d{6})', phoneNumber)

In [56]: result.group('first')
Out[56]: '110'

In [57]: result.group('second')
Out[57]: '120130'
# 使用具有名字的分组,可以提高准确性

非捕获组

摘自这里

字符 描述 示例
(?:pattern) 匹配pattern,但不捕获匹配结果。 ‘industr(?:y |ies) 匹配’industry’或’industries’
(?=pattern) 匹配pattern,但不捕获匹配结果。 ‘Windows (?=95|2000)’ 匹配 “Windows2000” 中的 “Windows” 不匹配 “Windows3.1” 中的 “Windows”。
(?!pattern) 零宽度负向预查,不捕获匹配结果。 ‘Windows (?!95|2000)’ 匹配 “Windows3.1” 中的 “Windows” 不匹配 “Windows2000” 中的 “Windows”。
(?<=pattern) 零宽度正向回查,不捕获匹配结果。 ‘2000 (?<=Office|Excel)’ 匹配 “ Office2000” 中的 “2000” 不匹配 “Windows2000” 中的 “2000”。
(?<!pattern) 零宽度负向回查,不捕获匹配结果。 ‘2000 (?<!Office|Excel)’ 匹配 “ Windows2000” 中的 “2000” 不匹配 “ Office2000” 中的 “2000”。

非捕获组只匹配结果,但不捕获结果,也不会分配组号,当然也不能在表达式和程序中做进一步处理。

首先(?:pattern)与(pattern)不同之处只是在于不捕获结果。

接下来的四个非捕获组用于匹配pattern(或者不匹配pattern)位置之前(或之后)的内容。匹配的结果不包括pattern。

例如:(?<=<(\w+)>).*(?=<\/\1>)匹配不包含属性的简单HTML标签内的内容。

如:<div>hello</div>之中的hello,匹配结果不包括前缀<div>和后缀</div>。