【问题标题】:Regex: Searching several possible groups正则表达式:搜索几个可能的组
【发布时间】:2012-12-31 14:04:59
【问题描述】:

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

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

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

有什么想法吗?

【问题讨论】:

    标签: python regex regex-group information-extraction


    【解决方案1】:

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

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

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

    【讨论】:

    • [\w- ] 在 Python、Ruby 等中无效,但在 PCRE 中有效(匹配单词、- 和空格)。 (不过,您的解释没有错)。而且“未命名”在术语上有点偏离,应该是非捕获组。
    • 感谢指正。 +1 用于 PCRE 提及;我不知道这是有效的。
    • 是的,我的两次尝试都是故意不同的。我试过你的建议,它也返回了一个错误。我正在使用regexplanet.com/advanced/python/index.html 进行测试。
    • 我刚刚在另一个网站 (pythonregex.com) 上试了一下,效果很好!
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-23
      • 2014-06-02
      • 2023-04-10
      • 2013-08-16
      • 1970-01-01
      相关资源
      最近更新 更多