【问题标题】:Regular Expression for pattern surrounded by optional angle brackets由可选尖括号包围的模式的正则表达式
【发布时间】:2014-02-18 17:23:51
【问题描述】:

我正在尝试使用正则表达式来查找可选用尖括号括起来的数字,即<>。我正在使用的模式,

<?(?P<fraction>[-+]?[-+0-9.Ee]+)>?

可以找到周围的括号。但如果只有一个括号,那么它也匹配。我只希望它在打开和关闭尖括号都存在或者它们都不存在时匹配。

我想匹配诸如:

-11.88
<0.012541>
-<3.14>
<-2.98>

我不想匹配:

<1.23
<-abcdefg>

我也不想重复我用来匹配数字的模式。这感觉像是一个容易出错的解决方案。

【问题讨论】:

  • 但是您想在匹配中包含这些括号吗?还是只有数字?
  • 我不需要保留括号,但它们可选地需要匹配

标签: python regex


【解决方案1】:

简单的解决方案: 复制/粘贴模式(第一个选项带尖括号,第二个选项不带):

<(?P<fraction>[-+]?[-+0-9.Ee]+)>|(?P<fraction>[-+]?[-+0-9.Ee]+)

更高级的解决方案:看看If-Then-Else Conditionals in Regular Expressions。如果某个组(命名或编号)匹配,它们允许您指定要匹配的模式。因此,在您的情况下,您可以查看是否匹配左尖括号,然后才匹配右尖括号。

【讨论】:

  • 我不认为 python 的内置 re 模块支持“if-then-else”条件。较新的 regex 模块(最终将取代 re)可能会支持它...
  • @mgilson:奇怪的是新的正则表达式模块似乎没有这个功能。
  • 是的,我不想复制/粘贴模式。在我原来的问题中应该更明确。现已更新。
【解决方案2】:

简单直接,无需特殊功能:

^(-?&lt;\d+\.\d+&gt;)|(&lt;-?\d+\.\d+&gt;)|(-?\d+\.\d+)$

简单和易于维护是正则表达式的关键,它们最适合用于匹配,而不是在它们内部进行过程条件逻辑,这是您正在尝试做的事情

【讨论】:

    【解决方案3】:

    如果您不想重复正则表达式的数字部分,也许可以使用命名条件:

    ^[-+]?(?P<o><)?[-+0-9.Ee]+(?(o)>|)$
    

    细分:

    ^               # Start
      [-+]?         # Get a -/+ if any
      (?P<o><)?     # Get a < if any
      [-+0-9.Ee]+   # Get the numbers
      (?(o)>|)      # If a < was matched, match a >, otherwise, don't match anything
    $               # End
    

    regex101 demo

    ideone demo


    如果你想要一些东西来真正验证数字(并防止像 -&lt;-2&gt; 这样的东西),你可以使用这样的东西:

    ^(?P<s>[-+])?(?P<o><)?(?(s)|[-+]?)\d+(?:\.\d+(?:[Ee][-+]\d+(?:\.\d+)?)?)?(?(o)>|)$
    

    注意:我通常不验证 .2e-.3 之类的东西(即没有前导零的小数),所以上面的内容也可以防止这种情况发生。如果字符串是0.2e-0.3,它确实有效,但允许前导零和尾随零。

    regex101 demo

    【讨论】:

    • 这正是我想要的——而且随着你编辑的越多,它会变得越来越好。我希望我能给你 +2 来阅读我的想法!
    • @Jeremy 我最初选择\d+\.\d+ 作为数字,你似乎并没有把标志放在很重要的位置,所以我只是在整个编辑过程中简化了它^^;最万无一失的解决方案是确保号码不只是一堆---eeEee
    • 以下输入 -&lt;-3.0123&gt; 失败
    • @JarrodRoberson 不管你说什么。如果您看到我的第一个正则表达式(在编辑历史记录中),您会看到我在开始时检查了它,并在注意到 OP 的数字正则表达式为 [-+0-9.Ee]+ 后将其删除。这意味着不仅要验证数字,更重要的是,eeeeee 也将通过测试。另外,为什么双减号会出错? -(-2) 等价于 2
    猜你喜欢
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多