正则表达式:搜索几个可能的组

时间:2013-01-17 04:27:38

标签: python regex regex-group information-extraction

正则表达专家请帮忙!我有以下两个例子:

'(JEN) This is a sentence.'
'This is another sentence (412).'

我试图以下列方式提取这两个句子的不同可能元素(知道有三种可能的元素类型):

['JEN', 'This is a sentence', None]
[None, 'This is another sentence', 412]

有人知道如何解决这个问题吗?

我尝试了以下正则表达式:

r'(\(([A-Z]{3})\))?\s*([\w- ]+)?\s*(\(([0-9]{3})\))?'
r'(?:\(([A-Z]{3})\)\s*)(?:([\w- ]+))(?:\(([0-9]{3})\))' # Passive Groups

对于两者,我都会收到无效正则表达式的错误。

任何想法为什么?

2 个答案:

答案 0 :(得分:2)

发生

sre_constants.error: bad character range因为[\w- ]被解释为范围。可以使用[\w -],但通常-应在字符类中进行转义:[\w\- ]

此外,您的表达方式不相同(除了分组)。我不确定这是否是故意的,但请注意(regex)?的非捕获版本是(?:regex)?,而不是(?:regex)。为了表现类似于第一个表达式,第二个表达式应该是:

r'(?:\(([A-Z]{3})\))?\s*([\w\- ]+)?\s*(?:\(([0-9]{3})\))?'

答案 1 :(得分:0)

就个人而言,我会说只是捕获组内的实际括号,你知道第1组和第3组的结果将有它们,所以你可以容纳,正则表达式当然是理智的。

此外,在这种情况下,“句子”可能更好地定义为“除了右括号之外的任何东西”。话虽如此,这适用于您的所有输入:

r'(\([A-Z]{3}\))?\s*([^(]+)(\(\d{3}\))?'