用Pythonic的方式编写两个if语句

3

我有两个变量是正则表达式搜索的结果。

a = re.search('some regex', str)
b = re.search('different regex', str)

这应该返回一个re对象。如果它们不是None,我想使用group()方法来获取它匹配的字符串。这是我现在使用的代码:

if a != None:
   a = a.group()
if b != None:
   b = b.group()

有没有更聪明的方法来编写这两个if语句?也许可以将它们合并成一个?我认为用4行代码实现这个功能太冗长了。

谢谢。


2
看不出来有什么可能更短了。你想看到什么?你能提供一些语法,不需要写四行代码吗?可以给出一些虚拟的 Python 示例吗?或者是其他语言的没有四行代码的示例?你有什么建议? - S.Lott
2
在这之后你将如何使用 ab?我的意思是,其中一个或两个都可能是“None”而不是列表,那么该如何处理? - Carson Myers
3
在Python中,“clever”通常意味着“可读性较差”,而很少意味着“更高效”。另外,更推荐使用形式为if a is not None:的语句。 - msw
1
我能否提出一个易读性请求,即您不要将ab用于两个不同的目的? - Stephen
重复使用a和b来完成两个不同的任务?你是什么意思? - passinhi
显示剩余4条评论
5个回答

5
不要覆盖内置的str,并且说
if a:

替代

if a != None

我的看法是,没有太多需要改进的地方。

4

a = a.group() if a else None


2

如果你真的需要一个简短的描述:

a, b = a.group() if a else None, b.group() if b else None

2

正如我所评论的,我更喜欢不要同时将ab用于Match对象和匹配的文本。我会使用一个函数来提取匹配项,就像这样:

>>> def text_or_none(v): return v.group() if v is not None else None
>>> a = text_or_none(re.search("\d", "foo"))
None
>>> b = text_or_none(re.search("\w+", "foo"))
foo

0

你可以进行一些重构:

a, b = (var.group() if var is not None else None for var in (a,b) )

如果a的值为0,这将保留它。这是您请求的结束。

然而,经过一段时间后,考虑到上下文,我想出了这个建议:

import re
target = """"Id","File","Easting","Northing","Alt","Omega","Phi","Kappa","Photo","Roll","Line","Roll_line","Orient","Camera"
1800,2008308_017_079.tif,530658.110,5005704.180,2031.100000,0.351440,-0.053710,0.086470,79,2008308,17,308_17,rightX,Jen73900229d
"""
print target
regs=(',(.*.tif)',',(left.*)',',(right.*)')
re_results=(result.group()
            for result in ((re.search(reg, target)
                            for reg in regs)
                           )
            if result is not None)
print list(re_results)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接