仅在一行中从字符串中提取字符

时间:2018-07-31 18:20:09

标签: python regex

根据反馈进行编辑: 通常,当我要提取字符串的一部分时,我会这样做:

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)]

1 个答案:

答案 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)