【问题标题】:Python regular expressions: how to match multiple substrings inside a single regular expression?Python正则表达式:如何匹配单个正则表达式中的多个子字符串?
【发布时间】:2012-02-02 01:30:34
【问题描述】:

我正在尝试使用 Python 3.2 解析生成的 ARFF 文件。目前,我正在尝试编写一个正则表达式,它将读取结构如下的行

@attribute sepallength {'\'(-inf-5.55]\'','\'(5.55-6.15]\'','\'(6.15-inf)\''}

并返回一个 MatchObject,其 groups() 函数返回

("sepallength", "'\\'(-inf-5.55]\\''", "'\\'(5.55-6.15]\\''", "'\\'(6.15-inf)\\''")

换句话说,我正在尝试编写一个正则表达式来匹配一个或多个遵循某种格式的子字符串。

我当前的尝试看起来像这样(行是一个字符串):

matches = re.match(r"@attribute (\w+) {(?:([^,]+),?)+}", line)

但它的 group() 函数只返回与花括号内的模式匹配的最后一个子字符串:

('sepallength', "'\\'(6.15-inf)\\''")

为什么第二个加号没有使表达式匹配满足我编写的非逗号规则的每个实例?如何轻松获得我想要的值?

【问题讨论】:

    标签: regex python-3.x


    【解决方案1】:

    你的问题的答案

    为什么第二个加号不使表达式匹配每个 满足我写的非逗号规则的实例?

    至少记录在Match Objects 部分:

    如果一个组匹配多次,则只能访问最后一个匹配

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 我看不到让 findall() 工作的方法。如果我只是在寻找诸如字母数字序列之类的东西,那就太好了,但我特别在寻找必须用花括号包围的逗号分隔的非逗号字符串。另外,我想同时获取属性的名称(例如,'sepallength')。 findall() 可以应用于这个问题吗?
      • 嗯,听起来很复杂。我认为通过使用执行多个步骤的函数来解决问题,您会得到更好的服务。 1) 阅读该行 2) 获取“sepalllength” 3) 获取 {} 和 split(',') 之间的所有内容
      • 我目前正在使用类似的解决方案,只是为了继续前进。但是,正则表达式的概念是否允许多个子字符串匹配的想法?并且,如果是这样,正则表达式的 Python 表示是否支持它?
      • 是的,但我认为你在正则表达式中混合了更多匹配,而不是在正则表达式匹配一次但你使用 re.findall(regex, subject)。
      猜你喜欢
      • 2014-10-11
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多