缩短Python中的正则表达式使用语法

时间:2015-09-02 11:16:12

标签: python regex

我很抱歉,因为我来自Perl而且我是Python新手。

以下示例对我来说很长:

#!/usr/bin/python
import re
r = re.compile('(?i)m(|[ldf])(\d+)')
m = r.match(text)
if m:
    print m.group(2)

在Perl中,它只有一行,而且非常易读。

#!/usr/bin/perl
print $2 if /m(|[ldf])(\d+)/i

如何更简单地重写我的Python示例。如果可能的话,可以像Perl一样轻。

我打算写大量的测试,如果我想保持我的代码可读,我想避免消耗那些无法帮助人们理解我的程序的行。我想我的第一个解决方案是下面这样的东西会更具可读性:

r = R()
if r.exec('(?i)m(|[ldf])(\d+)', text):    print r.group(2)
if r.exec('(?i)k(|[rhe])(\d{2})', text):  print r.group(2)

不幸的是,在这种情况下,我必须为此编写一个类。

1 个答案:

答案 0 :(得分:2)

Python方式重视清晰度而不是简洁,所以事情通常会比Perl更冗长。也就是说,re.compile步骤是可选的。

m = re.match('(?i)m(|[ldf])(\d+)', text)
if m:
  print m.group(2)

在Python中,赋值不是表达式;它们不能用作价值观。因此,无法跳过单独的赋值语句(m = ...)或将其与if结合使用。如果您想稍后引用匹配对象,则需要显式赋值 - 没有类似于自动存储捕获组的Perl $n变量的全局隐式状态。