正则表达专家请帮忙!我有以下两个例子:
'(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
对于两者,我都会收到无效正则表达式的错误。
任何想法为什么?
答案 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}\))?'