【问题标题】:Why isn't this regex working in python? It's valid and works fine on RegExr为什么这个正则表达式不能在 python 中工作?它在 RegExr 上有效且工作正常
【发布时间】:2014-05-26 09:08:55
【问题描述】:

我有这个正则表达式,用于将字符串拆分为以后可以处理的标记。我使用 RegExr(在线工具)制作了它,它在那里工作正常,但我无法让它在 python 中工作。我现在用它来打印比赛。

sunit = "A^2.1e2 m/s -180.2"
pat = "[A-Za-z]+(\^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)?|\/|\*|[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?"
Terms = re.findall(pat,sunit)
print Terms

正则表达式应该匹配:

A^2.1e2
m
/
s
-180.2

【问题讨论】:

  • 养成在定义正则表达式时使用原始字符串文字的习惯:不是“\.*”而是 r“\.*”。使用原始字符串文字(带有前导 'r' 字符),您不必将反斜杠加倍。

标签: python regex python-2.7


【解决方案1】:

解决了。使用 're.finditer()' 而不是 're.findall()' 似乎可行。这是我现在想出的。很抱歉打扰你,我早就应该解决这个问题了。

sunit = r"A^2.1e2 m/s -180.2"
pat = r"[A-Za-z]+(\^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)?|\/|\*|[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?"
Terms = re.finditer(pat,sunit)
for m in Terms:
    print m.group(0)

【讨论】:

  • 令我困扰的是,更多的人不会像你刚才那样回来发布他们的解决方案。 :)
【解决方案2】:

您的正则表达式中有组捕获 (...)。如果您不想捕获这些组,则只需从那里删除括号。或者使用括号内的?: 忽略它,例如(?:...)。我已经更改了您的正则表达式,它将适用于 re.findall

pat = "[A-Za-z]+(?:\^[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?)?|\/|\*|[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?"
                 ^^                       ^^                                               ^^

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-07
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 2013-11-05
    • 2020-04-26
    • 1970-01-01
    相关资源
    最近更新 更多