- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python正则表达式教程之二:捕获篇由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
在上一篇文中,我们介绍了关于Python正则表达式的基础,那么在这一篇文章里,我们将总结一下正则表达式关于捕获的用法。下面话不多说,来看看详细的介绍吧。 。
捕获 。
捕获和分组在正则表达式中有着密切的联系,一般情况下,分组即捕获,都用小括号完成(因此,小括号在正则表达式中也属于特殊字符,表达原含义时需要转义): 。
(…) 正常分组,并捕获 。
(?:…) 分组,但是不捕获 。
举个例子,假设我们需要匹配一个座机号码:
1
2
3
4
5
6
7
|
>>> 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
1
2
|
>>> re.findall(r
'(\d{3,4}-)?(\d{7,8})'
,
'020-82228888\n0357-4227865'
)
[(
'020-'
,
'82228888'
), (
'0357-'
,
'4227865'
)]
|
findall有一个特性,就是如果结果中有捕获的分组,则将捕获的分组组成tuple返回。利用这个特点,和上面提到的分组,但是不捕获的语法,可以得到我们想要的结果:
1
2
3
4
|
>>> re.findall(r
'(?:\d{3,4}-)?\d{7,8}'
,
'020-82228888\n0357-4227865'
)
[
'020-82228888'
,
'0357-4227865'
]
>>> re.findall(r
'(?:\d{3,4}-)?\d{7,8}'
,
'020-82228888\n4227865'
)
[
'020-82228888'
,
'4227865'
]
|
在正则表达式中,也可以通过\1,\2等来指代之前捕获的字符串组合。这个经常用于单双引号的正确匹配:
1
2
3
4
5
|
>>> 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这种表示可读性不好的话,还可以给捕获起一个英文名字。如下例子中,实现了两种不同的日期格式之间的转换:
1
2
3
|
>>> 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中却是无效的:
1
2
3
4
5
6
7
8
|
>>> 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能能带来一定的帮助,如果有疑问大家可以留言交流,如果有疑问大家可以留言交流。下一篇文章,我会继续总结一下正则表达式匹配时的贪婪/非贪婪特性。 请继续关注我.
原文链接:http://blog.guoyb.com/2017/02/27/python-regex-2/ 。
最后此篇关于Python正则表达式教程之二:捕获篇的文章就讲到这里了,如果你想了解更多关于Python正则表达式教程之二:捕获篇的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个加号/减号按钮,希望用户不能选择超过 20 个但不知道如何让它工作。我尝试使用 min="1"max="5 属性,但它们不起作用。这是我的代码和一个 fiddle 链接。https://jsf
我正在尝试复制顶部底部图,如示例 here但它没有正确渲染(紫色系列有 +ve 和 -ve 值,绿色为负值)留下杂乱的人工制品。我也在努力创建一个玩具示例来复制这个问题,所以我希望尽管我缺乏数据,但有
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭 6 年前。 社区去年审查了是
这个问题在这里已经有了答案: Adding two positive integers gives negative answer.Why? (4 个答案) 关闭 5 年前。 我遇到了一个奇怪的问题
有谁知道如何将字符串值类型 -4,5 或 5,4 转换为 double -4.5 或 5.4? 最佳答案 只需使用 Double.parseDouble(Locale, String); 糟糕,我很困
我正在尝试根据 TextBlob 分类插入一个仅包含“正”或“负”字符串的新数据框列:对于我的 df 的第一行,结果是 ( pos , 0.75, 0.2499999999999997)我想要' 正
我对 VBA 非常陌生,无法理解如何在一个循环中完成 2 个任务。我非常感谢您的帮助。 我已经能够根据第 3 列中的数据更改第 2 列中的数值,但我不明白如何将负值的字体更改为红色。 表格的大小每月都
欢迎, 我正在使用 jquery 通过 POST 发送表单。 这就是我获得值(value)的方式。 var mytext = $("#textareaid").val(); var dataStrin
double d = 0; // random decimal value with it's integral part within the range of Int32 and always p
我有这个字符串: var a='abc123#xyz123'; 我想构建 2 个正则表达式替换函数: 1) 用 '*' 替换所有确实有 future '#'的字符(不包括'#') 所以结果应该是这样的
我正在使用 DialogFragment。当用户从 Gmail 平板电脑应用程序的屏幕与下面示例图片中的编辑文本进行交互时,我希望正面和负面按钮保持在键盘上方。 在我的尝试中不起作用,这是我的 Dia
从组装艺术一书中,我复制了这句话: In the two’s complement system, the H.O. bit of a number is a sign bit. If the H.O
是否有更好更优雅的方法来实现下面的简单代码(diffYear、A 和 B 是数字): diffYear = yearA - yearB; if (diffYear == 0) { A = B
我正在设计一种语言,并尝试确定 true 应该是 0x01 还是 0xFF。显然,所有非零值都将转换为 true,但我正在尝试确定确切的内部表示。 每种选择的优点和缺点是什么? 最佳答案 没关系,只要
在我的 dialogfragment 类的 OnCreateDialog 中,我正在这样做: AlertDialog.Builder builder = new AlertDialog.Builder
这个问题在这里已经有了答案: Resolving ambiguous overload on function pointer and std::function for a lambda usin
我偶然发现了一个奇怪的 NSDecimalNumber 行为:对于某些值,调用 integerValue、longValue、longLongValue 等,返回意想不到的值(value)。示例: l
这个问题在这里已经有了答案: Resolving ambiguous overload on function pointer and std::function for a lambda using
我有这个正则表达式来测试用户输入是否有效: value.length === 0 || value === '-' || (!isNaN(parseFloat(value)) && /^-?\d+\.
我想用高斯混合模型拟合数据集,数据集包含大约 120k 个样本,每个样本有大约 130 个维度。当我使用 matlab 执行此操作时,我运行脚本(簇号为 1000): gm = fitgmdist(d
我是一名优秀的程序员,十分优秀!