定位和可选组

时间:2015-03-03 17:35:14

标签: python regex

我的示例数据集:

Loaded: mismatch (No such file or directory)
Loaded: not-found ()
Loaded: error (Reason:No such file or directory)
Loaded: error (Reason: No such file or directory)
Loaded: mystery

我的正则表达式测试(逐行阅读):

re.findall("[Loaded: ](\S*) \([Reason: ]?(.*)\)", line)

我分别得到了:

[('mismatch', 'No such file or directory')]
[('not-found', '')]
[('error', 'eason:No such file or directory')]
[('error', 'eason: No such file or directory')]

第一个和第二个列表没问题。

但第三和第四不是,它缺少第五。

如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

re.findall(r"Loaded:\s*(\S*)\s*(?:\((?:Reason:\s*)?(.*)\))?", line)

试试这个。

答案 1 :(得分:1)

不确定这是否是您所需要的,但它与所有相匹配 你的测试字符串正确。

组1是加载的消息,组2是原因。

 # Loaded:\s+(\S+)(?:\s+\((?:Reason:\s*)?([^)]*)\))?     

 Loaded: \s+ 
 ( \S+ )                  # (1)
 (?:
      \s+ 
      \( 
      (?: Reason: \s* )?
      ( [^)]* )                # (2)
      \) 
 )?