【问题标题】:Matching number string pairs匹配数字字符串对
【发布时间】:2015-05-01 22:37:58
【问题描述】:

我有以下示例字符串:

 R10666: 273141 C1 + 273141 C2 + 273141 C3 + 273141 C4 + 273141 C5 - 273141 C6

我要获取:

[('273141','C1'), ..., ('- 273141', 'C6')]

这些数字可以是带有指数符号的浮点数,即- 2.5e-7

我当前的正则表达式如下所示:

re.findall(r'([+-]? \d+(\.\d*)?|\.\d+([eE][+-]?\d+)?)( [a-zA-Z0-9_]+)', split)

但它没有产生正确的输出,有什么问题?

这是一个示例输出:

(' 273141', '', '', ' C1')

或者它什么都不匹配。

【问题讨论】:

    标签: python regex python-2.7


    【解决方案1】:

    findall 会将所有子匹配项放入结果中。在您的情况下,空字符串来自不匹配的小数(如果存在);所以请改用非捕获组:

    ([+-]? \d+(?:\.\d*)?|\.\d+(?:[eE][+-]?\d+)?) ([a-zA-Z0-9_]+)
    

    我还将第二个捕获组的空间移到外面,这样你就不会得到那个领先的空间。

    regex101 demo

    ideone demo

    【讨论】:

    • 它不匹配例如 2.263574e+07
    • @quesaionasi 请更新您的问题。我真的很想帮助你,但如果问题不完整,我无能为力。超出您的要求将涉及做出假设,因此这样做可能会引入错误,因此不是您所期望的。
    【解决方案2】:

    我为您调整了Floating Point Numbers with a Regular Expression 正则表达式并稍微缩短了正则表达式(注意替代列表消失了,这意味着回溯更少,前面的(?i) 不区分大小写匹配选项将[A-Za-z] 转换为[a-z] ):

    import re
    s = "R10666: 273141 C1 + 273141 C2 + 273141 C3 + 273141 C4 + 273141 C5 - 273141 C6"
    print re.findall(r'(?i)([-+]?\s*\d*\.?\d+(?:[eE][-+]?\d+)?)(\s+\w+)', s)
    

    IDEONE demo 的输出:

    [(' 273141', ' C1'), ('+ 273141', ' C2'), ('+ 273141', ' C3'), ('+ 273141', ' C4'), ('+ 273141', ' C5'), ('- 273141', ' C6')]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      相关资源
      最近更新 更多