python学习:正则表达式re模块的使用

jupiter
2021-10-31 / 0 评论 / 713 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年12月07日,已超过809天没有更新,若内容或图片失效,请留言反馈。

1.常用常量

1.1 re.I(re.IGNORECASE)

  • 执行不区分大小写的匹配;类似的表达式也[A-Z]将匹配小写字母。
re.findall(r"[a-z]", "ah667GHD67DYT78")
# Return:['a', 'h']
 
re.findall(r"[a-z]", "ah667GHD67DYT78",flags=re.IGNORECASE)
# Return:['a', 'h', 'G', 'H', 'D', 'D', 'Y', 'T']

1.2 re.S(re.DOTALL)

  • 使'.'特殊字符与任何字符都匹配,包括换行符;没有此标志,'.'将匹配除换行符以外的任何内容。
s = '''first line
second line
third line'''

re.findall(r".+", s)
# Return:['first line', 'second line', 'third line']

re.findall(r".+", s, flags=re.DOTALL)
# Return:['first line\nsecond line\nthird line']

2.常用方法

2.1 re.match(pattern,string,flags = 0 )

  • 对字符串从开头进行正则匹配 (匹配零个或者一个对象)
  • 如果字符串与模式匹配,则返回相应的匹配对象。
re.match('a','abcade') 
# Return:<re.Match object; span=(0, 1), match='a'>
re.match('\w+','abc123de')
# Return:<re.Match object; span=(0, 8), match='abc123de'>
  • 如果字符串与模式不匹配,则返回None
re.match('z','abcade')
# Return:None
  • 可以使用group()获取匹配结果
re.match('a','abcade').group()
# Return:'a'

2.2 re.search(pattern,string,flags = 0 )

  • 扫描字符串以查找正则表达式模式产生匹配项的第一个位置(匹配零个或者一个对象)

    • 与re.match的区别

      • re.match是从字符串的开头进行匹配
      • re.search是从对字符串的挨个位置都进行尝试,指导匹配上或者尝试完所有位置
  • 如果匹配上,则返回相应的match对象。
re.search('b','abcade')
# Return:<re.Match object; span=(1, 2), match='b'>
re.search('b','abcade').group()
# Return:'b'
  • 如果字符串中没有位置与模式匹配,则返回None;
re.search('z','abcade')
# Return:None

2.3 re.compile(pattern,flags = 0 )

  • 该方法同re.match和re.search
  • 将正则表达式模式编译为正则表达式对象,可使用match(),search()以及下面所述的其他方法将其用于匹配
reg = re.compile('\d{2}') # 正则对象-匹配两个数字
reg.search('12abc')
# Return:<re.Match object; span=(0, 2), match='12'>
reg.search('12abc').group()
# Return:12
reg = re.compile('\d{2}') # 正则对象-匹配两个数字
reg.match('123abc')
# Return:<re.Match object; span=(0, 2), match='12'>
reg.match('12abc').group()
# Return:12

2.4 re.fullmatch(pattern,string,flags = 0 )

  • 如果整个字符串与正则表达式模式匹配,则返回相应的match对象。
re.fullmatch('\w+','abcade')
# Return:<re.Match object; span=(0, 6), match='abcade'>
re.fullmatch('\w+','abcade').group()
# Return:'abcade'
  • 否则返回None;
re.fullmatch('\w+','abca de')
# Return:None

2.5 re.split(pattern,string,maxsplit = 0,flags = 0 )

  • 通过正则表达式来split字符串。
re.split(r'\W+', 'Words, words, words.')
# Return:['Words', 'words', 'words', '']
  • 如果在pattern中使用了捕获括号,那么模式中所有组的文本也将作为结果列表的一部分返回。
re.split(r'(\W+)', 'Words, words, words.')
# Return:['Words', ', ', 'words', ', ', 'words', '.', '']
  • 如果分隔符中有捕获组,并且该匹配组在字符串的开头匹配,则结果将从空字符串开始。字符串的末尾也是如此:
re.split(r'(\W+)', '...words, words...')
# Return:['', '...', 'words', ', ', 'words', '...', '']
  • 如果maxsplit不为零,则最多会发生maxsplit分割,并将字符串的其余部分作为列表的最后一个元素返回。
re.split(r'\W+', 'Words, words, words.',1)
# Return:['Words', 'words, words.']

2.6 re.findall(pattern,string,flags = 0 )

  • 从左到右扫描该字符串,以列表的形式返回所有的匹配项
re.findall('a', 'This is a beautiful place!')
# Return:['a', 'a', 'a']
re.findall('z', 'This is a beautiful place!')
# Return:[]

2.7 re.sub(pattern,repl,string,count = 0,flags = 0 )

  • 使用repl替换掉string中pattern成功匹配的匹配项,count参数表示将匹配到的内容进行替换的次数
re.sub('\d', 'S', 'abc12jh45li78') #将匹配到所有的数字替换成S
# Return:'abcSSjhSSliSS'

re.sub('\d', 'S', 'abc12jh45li78', 2) #将匹配到的数字替换成S,只替换2次就停止
# Return:'abcSSjh45li78'
  • 如果找不到该模式, 则返回的字符串不变。
re.sub('z', 'S', 'abc12jh45li78')
# Return:'abc12jh45li78'

2.8 re.subn(pattern,repl,string,count = 0,flags = 0 )

执行与相同的操作sub(),但返回一个元组。(new_string, number_of_subs_made)

re.subn('\d', 'S', 'abc12jh45li78')
# Return:('abcSSjhSSliSS', 6)
re.subn('\d', 'S', 'abc12jh45li78', 3)
# Return:('abcSSjhS5li78', 3)

3. 其他补充

3.1 使用正则表达式匹配中文

 re.findall(r"[\u4e00-\u9fa5]", "沿charlie在charlie五前等待。charlie charlie五前等四川八八六四")
 # Return:['沿', '在', '五', '前', '等', '待', '五', '前', '等', '四', '川', '八', '八', '六', '四']

3.2 贪心匹配和非贪心匹配

  • 贪心匹配:正则表达式在有二义的情况下,会尽可能匹配最长的字符串
  • Python的正则表达式默认是”贪心“的,这表示在有二义的情况下,会尽可能匹配最长的字符串。
re.search(r'(ha){3,5}','hahahahaha').group()
# Return:'hahahahaha'
  • 非贪心匹配:匹配尽可能最短的字符串
  • 使用方式:在有二义的正则表达式的后面跟一个问号
re.search(r'(ha){3,5}?','hahahahaha').group()
# Return:'hahaha'

参考资料

  1. 使用正则表达式
  2. Python之re模块
  3. python 正则表达式详解
0

评论 (0)

打卡
取消