根据反馈进行编辑: 通常,当我要提取字符串的一部分时,我会这样做:
match = re.search('ma(\w)ch', 'match')
if match :
whatIWant = match.group(1)
这是3行。我宁愿做这样的事情:
if re.search('ma(\w)ch', 'match'):
whatIWant = $_.group(1)
至少有两行。甚至更好,
whatIWant = re.search('ma(\w)ch', 'match').group(1)
理想情况下,即使在列表理解中也能够做到。字符串列表。这将需要一行。有可能吗?
这是我现在正在使用的实际代码。但是我也对通用正则表达式的表达也很感兴趣。这就是为什么我在上面给出了一般示例。
observeStr = ['ch1', 'dq_23']
dqMatches = ['dq_*(\d+)', 'tx_*(\d+)', 'rx_*(\d+)']
dword = [re.search(dqMatch, el.lower()) for el in observeStr for dqMatch in dqMatches if re.search(dqMatch, el.lower())]
if len(dword) == 1:
observeStr += ['dword {0}'.format(int(dword[0].group(1)) / 32)]
答案 0 :(得分:1)
您的示例可以归结为
't' if 't' in 'match' else None
假设None
是您what_i_want
的目标,如果没有匹配项。确实,如果您只需要挑选字符,那么您根本就不需要re
。
在更普遍的情况下,您确实需要re
,如果您希望将其缩减为两行,则可以这样做
match = re.search('ma(t)ch', 'match')
what_i_want = match.group(1) if match else None
在不久的将来,您将获得与首选解决方案所希望的结果接近的东西,因为PEP 572 (Assignment Expressions)提到了您的示例作为具体用例:
恰当的例子:Guido找到了几个例子,其中程序员重复了一个子表达式,从而减慢了程序速度,以节省一行代码,例如而不是写:
match = re.match(data) group = match.group(1) if match else None
他们会写:
group = re.match(data).group(1) if re.match(data) else None
该功能将在Python 3.8中提供,您可以使用该功能编写示例
if match := re.search('ma(t)ch', 'match'):
what_i_want = match.group(1)