由可选尖括号包围的图案的正则表达式

时间:2014-02-18 17:23:51

标签: python regex

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

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

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

我希望匹配以下内容:

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

我不想匹配:

<1.23
<-abcdefg>

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

3 个答案:

答案 0 :(得分:2)

天真的解决方案:复制/粘贴模式(第一个替代方案是尖括号,第二个替代方案没有):

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

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

答案 1 :(得分:1)

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

^(-?<\d+\.\d+>)|(<-?\d+\.\d+>)|(-?\d+\.\d+)$

简单易维护是正则表达式的关键,它们最适合用于匹配,并且不在其中进行过程条件逻辑,这就是你要做的事情

答案 2 :(得分:0)

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

^[-+]?(?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


如果你想要真正验证数字(并防止像-<-2>这样的东西),你可以使用这样的东西:

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

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

regex101 demo