python - 在下一个方法中使用正则表达式和捕获组

时间:2016-12-30 10:26:07

标签: python regex

我需要这方面的帮助:

  1. 我打开文件,使用readlines方法创建一个列表。
  2. 我需要找到第一次出现的patern / match并将第一个捕获组分配给变量

    list = ['firstString','xxxSTATUS=100','thirdString','fourthString']
    value = next(x for x in list if [re.search('.*STATUS=(.*)', x)])
    
  3. 如果我按原样将它分配给'value',我得到'xxxSTATUS = 100'(字符串类型),但是如果我这样做的话:

      value = next(x for x in list if [re.search('.*STATUS=(.*)', x).group(1)])
    

    我明白了:

      

    AttributeError:'NoneType'对象没有属性'group'

    显然我不能做value.group(1),因为它是字符串而不是正则表达式对象。我也得到(这是我的假设),当我使用正则表达式模式时,我的变量仍然没有类型,因为它尚未分配。

    所以我的问题是如何解决这个问题并分配捕获组,例如。 '100'变量。有没有解决办法?

1 个答案:

答案 0 :(得分:1)

AttributeError: 'NoneType' object has no attribute 'group'错误只表示您没有匹配并尝试访问空对象的组内容。

我认为最简单的方法是迭代搜索匹配的列表项,找到后,获取第1组内容并将其分配给value

import re
list = ['firstString','xxxSTATUS=100','thirdString','fourthString']
value = ""
for x in list:
    m = re.search('STATUS=(.*)', x)
    if m:
        value = m.group(1)
        break

print(value)

请注意,您不需要模式中的初始.*,因为re.search模式未锚定在字符串的开头。

请参阅Python demo

此外,如果您希望初始方法有效,则需要首先检查是否与if re.search('STATUS=(.*)', x)匹配,然后再次运行以获取具有re.search('STATUS=(.*)', x).group(1)的组内容:

value = next(re.search('STATUS=(.*)', x).group(1) for x in list if re.search('STATUS=(.*)', x))