有许多表达式与数字匹配,例如\d
,1[0-9][0-9]
,\d{4}
,...
但是如何检查表达式是否只匹配数字?
例如,\d
匹配0到9,因此表达式 true 为“仅匹配数字”。
另一个例子,1[0-9a-z]
匹配数字10,但也匹配不是数字的1。所以 false 为“仅匹配数字”。
如上所述here很难描述“数字”是什么,因此我想将其限制为整数。
我的问题并不意味着我想要一个匹配整数的表达式,而是一种反向正则表达式来检查表达式本身。感谢阅读! :)
答案 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
}
请参阅RegExp和Automaton类的JavaDoc。这不是匹配问题的python标记的示例,但是您想要解决的问题本身并不是特定于语言的。