1

正则表达式回答是或否问题 - 字符串是否与模式匹配。

我想将 no 分为两类:

  • 作为有效字符串前缀的无效字符串
  • 不是有效前缀的无效字符串

这是一个示例(正则表达式01+2):

  • 012已验证

  • 12是无效的; 它不是有效字符串的前缀

  • 01是无效的; 它是有效字符串的前缀:012

Java 可以做到这一点。

可以re这样做吗?如果没有,是否有图书馆可以做出这种区分?

4

3 回答 3

5

我赞同正则表达式的建议。该模块简直太棒了。

这是使用正则表达式进行模糊匹配的示例:

import regex

# traditional matching - three digits
r = '(?:\d\d\d)'
print regex.findall(r, '1xx22yy333zz')
## ['333']

# fuzzy matching - three digits, allow at most 2 deletions
r = '(?:\d\d\d){d<3}'
print regex.findall(r, '1xx22yy333zz')
## ['1', '22', '333']

{d<3}部分基本上说“如果我们添加一个或两个字符,那将是一个匹配” - 与您的问题中的第 3 点相同。

有关更多信息,请参见http://pypi.python.org/pypi/regex(查找“近似“模糊”匹配”)。

于 2012-04-05T17:26:57.127 回答
2

我说不出你真正想要什么。您是否想了解增量匹配?

也许您需要学习正确使用锚点。就像你永远不应该使用 Java 错误命名和欺骗性matches的方法来代替它的find方法一样,你应该避免使用 Python 的match方法来支持 .search并且出于完全相同的原因。

另一种可能性是使用可选部分重写您的模式,然后您可以检查其是否成功。

或者也许你应该研究一下Matthew Barnett 的替换regex中的模糊匹配支持,你真的应该使用它而不是笨拙的旧的re

我无法说出您真正要问的是什么,因为您没有给出所需输入和输出的示例。

编辑

也许您不需要比 更复杂(?=.*(?:ab|bc)).*a?b?c?或间隔的东西:

 (?x)
 (?= .* (?: ab | bc) )
 .*
 a? b? c?

如果将abc放入可递归子组中,您甚至不必重复自己。

于 2012-04-05T17:08:46.443 回答
2

如果我错了,请纠正我,我相信最初的问题是:对于某些正则表达式和输入字符串,如果输入字符串可能匹配(即,在字符串末尾添加更多字符可以使其匹配)。

因此,模糊匹配不是答案,因为:

rgx = regex.compile('(abcdef){d<5}')

str = 'bcd'

也将是一场比赛

Boost C++ 库(也适用于 Java/Javascript?)提供了这样一个选项: http: //www.boost.org/doc/libs/1_31_0/libs/regex/doc/partial_matches.html

那么有谁知道在 Python 中实现这一目标的最佳方法是什么?

于 2012-10-20T14:36:56.707 回答