2

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

'(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

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

任何想法为什么?

4

2 回答 2

2

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

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

r'(?:\(([A-Z]{3})\))?\s*([\w\- ]+)?\s*(?:\(([0-9]{3})\))?'
于 2013-01-17T04:34:34.350 回答
0

就个人而言,我想说只捕获组内的实际括号,您知道第 1 组和第 3 组的捕获结果将包含它们,因此您可以适应,并且正则表达式当然更明智。

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

r'(\([A-Z]{3}\))?\s*([^(]+)(\(\d{3}\))?'
于 2013-01-17T06:18:17.083 回答