如何检查正则表达式是否只匹配数字?

时间:2014-11-24 10:07:51

标签: python regex

有许多表达式与数字匹配,例如\d1[0-9][0-9]\d{4},... 但是如何检查表达式是否只匹配数字?

例如,\d匹配0到9,因此表达式 true 为“仅匹配数字”。

另一个例子,1[0-9a-z]匹配数字10,但也匹配不是数字的1。所以 false 为“仅匹配数字”。

如上所述here很难描述“数字”是什么,因此我想将其限制为整数。

我的问题并不意味着我想要一个匹配整数的表达式,而是一种反向正则表达式来检查表达式本身。感谢阅读! :)

1 个答案:

答案 0 :(得分:3)

如果我正确理解了这个问题,你想检查 - 给定一些正则表达式 r - 如果 r 可能匹配任何不是数字的东西。从这个意义上说,空的正则表达式$^(无匹配)将通过测试,因为它不匹配任何东西(因此没有非数字)。但是,1[0-9][0-9a-z]匹配10s,这不是数字,因此测试失败。

使用Python的正则表达式设备是不可能的。您需要一种正则表达式语言,它支持交集(&),补码(〜)和非空虚测试(例如,通过匹配单词的生成)。然后,如果 r 是你的正则表达式,你需要检查是否

`r & ~(0|[1-9][0-9]*)`

非空。

交集和补充在计算上很昂贵,但有一些正则表达式库支持它们。我所知道的一个例子(Java)是BRICS automaton/regex library

这可以通过以下方式实现(假设您正在遵循BRICS正则表达式语法):

// Checks if `re` might match a non-number, and returns an example; otherwise, null is returned
public String matchesNonNumber(String re) {
  // construct regex like above
  RegExp bricsRe = new RegExp("(" + re + ") & ~(0|[1-9][0-9]*)", RegExp.INTERSECTION | RegExp.COMPLEMENT);
  Automaton a = bricsRe.toAutomaton();
  return a.getShortestExample(true); // returns shortest accepted string, or null if no string is accepted
}

请参阅RegExpAutomaton类的JavaDoc。这不是匹配问题的python标记的示例,但是您想要解决的问题本身并不是特定于语言的。