我是Perl用户多年,最近开始使用Python。你知道吗
我明白了做某些事情总有一种“显而易见的方法”。我想检查一下将下面的Perl代码风格转换为Python的“一”种方法。谢谢!你知道吗
目标是:
Perl语言:
if ($str =~ /my(pat1)and(pat2)/) {
my ($var1, $var2) = ($1, $2);
}
就我所学的Python而言,下面是我现在编写代码的方式。它似乎比Perl采取了更多的步骤。这就是为什么我怀疑我的Python代码。你知道吗
mySearch = re.search ( r'my(pat1)and(pat2)', str )
if mySearch:
var1 = mySearch.group(1)
var2 = mySearch.group(2)
Python不像perl那样优先处理模式匹配和字符串操作。这些是类似的模式,是的,Python的更长(它也有很多很棒的东西,比如它是面向对象的,不使用奇怪的全局变量)。你知道吗
不过,作为记录,您可以使用tuple unpacking使其更加简洁:
更新:
元组解包
元组解包是Python的一个有用特性。要理解它,我们首先要问,什么是tuple。元组的核心是一个不可变的序列,与列表不同的是,不能追加、弹出或任何类似的内容。从语法上讲,声明一个元组非常简单,它只是由逗号分隔的几个值。你知道吗
人们通常认为元组实际上是由周围的括号
my_tuple = ("I", "am", "awesome")
定义的,但这是错误的;括号只在阐明或强制执行某种操作顺序时才有用。你知道吗元组解包是Python中最可爱的特性之一。在左侧定义一个包含未定义名称的元组数据结构,然后将右侧的
iterable
解压到其中。右侧可以包含任何类型的iterable
,但其包含的数据的形状必须与左侧名称的元组结构完全匹配。你知道吗同样,我们不需要右边的列表,而是任何类型的iterable,例如,生成器:
甚至可以用嵌套的数据结构进行元组解包。你知道吗
如果右侧的iterable与左侧的模式不匹配,则会爆炸:
实际上,这种嘈杂的失败使元组解包成为我从
iterable
中获取项目的最常用方法,因为我认为iterable
中应该只有一个项目,如果它有多个项目,我希望我的代码失败。你知道吗多重分配
人们所认为的多重赋值实际上只是简单的元组解包。你知道吗
这没什么特别的。解释器将等式的右侧计算为
tuple
记住,元组只是由逗号分隔的值(文本、变量、已计算的函数调用等),然后解释器将其与左侧匹配,就像上面所有示例一样。你知道吗带回家
我写这篇文章是为了解释你在这个问题上得到的两个不同的答案:
以及
首先,认识到这两个语句,对于
mySearch
是由带有两个匹配组的正则表达式生成的MatchObject
的情况,在功能上是完全等价的。你知道吗它们只是在元组解包的性质方面有很小的不同。第一个在右边声明一个元组,而第二个使用
MatchObject.groups
返回的元组。你知道吗这实际上并不适用于您的情况,但了解
MatchObject.group
和MatchObject.groups
的行为略有不同可能会很有用(请参见here和here)。MatchObject.groups
返回regex遇到的所有“子组”(subgroups),即捕获组,而MatchObject.group
返回单个组,并将整个模式计数为0处可访问的组。你知道吗实际上,在这种情况下,你应该使用这两个你认为是最具表现力或最清晰的。我个人认为在右边提到组1和组2是多余的,而且我经常被
MatchObject.groups(0)
返回与整个模式匹配的字符串,从而将所有“子组”偏移到一个索引中这一事实所困扰。你知道吗您可以一次提取所有组并将其分配给变量:
在Python中,可以在一行中使用逗号作为分隔符进行多个变量赋值。你知道吗
其他的答案是关于元组解包。因此,如果您想将所有捕获的组内容提取到变量中,这会更好。如果您想获取特定组的内容,则必须使用我提到的方法。你知道吗
示例:
相关问题 更多 >
编程相关推荐