前言
在上一篇文中,我们介绍了关于Python正则表达式的基础,那么在这一篇文章里,我们将总结一下正则表达式关于捕获的用法。下面话不多说,来看看详细的介绍吧。
捕获
捕获和分组在正则表达式中有着密切的联系,一般情况下,分组即捕获,都用小括号完成(因此,小括号在正则表达式中也属于特殊字符,表达原含义时需要转义):
(…) 正常分组,并捕获
(?:…) 分组,但是不捕获
举个例子,假设我们需要匹配一个座机号码:
>>> m = re.search(r'^(\d{3,4}-)?(\d{7,8})$','020-82228888') >>> m.group(0) '020-82228888' >>> m.group(1) '020-' >>> m.group(2) '82228888'
这里,默认分组(0)是完整的匹配,之后的分组则按出现顺序排列。
接下来,我们想在一整段文本中,找出所有的座机号码,这里需要用到re.findall
:
>>> re.findall(r'(\d{3,8})','020-82228888\n0357-4227865') [('020-','82228888'),('0357-','4227865')]
findall有一个特性,就是如果结果中有捕获的分组,则将捕获的分组组成tuple返回。利用这个特点,和上面提到的分组,但是不捕获的语法,可以得到我们想要的结果:
>>> re.findall(r'(?:\d{3,4}-)?\d{7,8}','020-82228888\n0357-4227865') ['020-82228888','0357-4227865'] >>> re.findall(r'(?:\d{3,'020-82228888\n4227865') ['020-82228888','4227865']
在正则表达式中,也可以通过\1,\2等来指代之前捕获的字符串组合。这个经常用于单双引号的正确匹配:
>>> sentence = """You said "why?" and I say "I don't kNow".""" >>> re.findall(r'["\'](.*?)["\']',sentence) ['why?','I don'] >>> re.findall(r'(["\'])(.*?)\1',sentence) [('"','why?'),('"',"I don't kNow")]
此外,如果觉得\1,\2这种表示可读性不好的话,还可以给捕获起一个英文名字。如下例子中,实现了两种不同的日期格式之间的转换:
>>> sentence = "from 12/22/1629 to 11/14/1643" >>> re.sub(r'(?P<month>\d{2})/(?P<day>\d{2})/(?P<year>\d{4})',r'\g<year>-\g<month>-\g<day>',sentence) 'from 1629-12-22 to 1643-11-14'
但是,这种命名引用捕获的方式,在findall、search中却是无效的:
>>> sentence = """You said "why?" and I say "I don't kNow".""" >>> re.findall(r'(?P<quote>["\'])(.*?)\g<quote>',sentence) [] >>> re.search(r'(?P<quote>["\'])(.*?)\g<quote>',sentence) >>> re.search(r'(?P<quote>["\'])(.*?)\1',sentence) <_sre.SRE_Match object; span=(9,15),match='"why?"'> >>> re.search(r'(?P<quote>["\'])(.*?)\1',sentence).groupdict() {'quote': '"'}
总结
以上就是Python正则表达式中关于分组捕获的全部内容了,希望本文的内容对大家的学习或者使用python能能带来一定的帮助,如果有疑问大家可以留言交流,如果有疑问大家可以留言交流。下一篇文章,我会继续总结一下正则表达式匹配时的贪婪/非贪婪特性。 请继续关注编程小技巧。
您可能感兴趣的文章:
- Python使用正则表达式获取网页中所需要的信息
- python 正则表达式 re.sub & re.subn
- python使用正则表达式的search()函数实现指定位置搜索功能
- python正则表达式re之compile函数解析
- python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解
- Python基于正则表达式实现检查文件内容的方法【文件检索】
- Python基于正则表达式实现文件内容替换的方法
- Python正则表达式非贪婪、多行匹配功能示例
- Python正则表达式分组概念与用法详解
- Python正则表达式常用函数总结
- Python使用正则表达式实现文本替换的方法
- Python正则表达式教程之三:贪婪/非贪婪特性
- 详解Python中的正则表达式
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。