正则表达式回答是或否问题 - 字符串是否与模式匹配。
我想将 no 分为两类:
- 作为有效字符串前缀的无效字符串
- 不是有效前缀的无效字符串
这是一个示例(正则表达式01+2
):
012
已验证12
是无效的; 它不是有效字符串的前缀01
是无效的; 它是有效字符串的前缀:012
可以re
这样做吗?如果没有,是否有图书馆可以做出这种区分?
正则表达式回答是或否问题 - 字符串是否与模式匹配。
我想将 no 分为两类:
这是一个示例(正则表达式01+2
):
012
已验证
12
是无效的; 它不是有效字符串的前缀
01
是无效的; 它是有效字符串的前缀:012
可以re
这样做吗?如果没有,是否有图书馆可以做出这种区分?
我赞同正则表达式的建议。该模块简直太棒了。
这是使用正则表达式进行模糊匹配的示例:
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(查找“近似“模糊”匹配”)。
我说不出你真正想要什么。您是否想了解增量匹配?
也许您需要学习正确使用锚点。就像你永远不应该使用 Java 错误命名和欺骗性matches
的方法来代替它的find
方法一样,你应该避免使用 Python 的match
方法来支持 .search
并且出于完全相同的原因。
另一种可能性是使用可选部分重写您的模式,然后您可以检查其是否成功。
或者也许你应该研究一下Matthew Barnett 的替换regex
库中的模糊匹配支持,你真的应该使用它而不是笨拙的旧的re
。
我无法说出您真正要问的是什么,因为您没有给出所需输入和输出的示例。
也许您不需要比 更复杂(?=.*(?:ab|bc)).*a?b?c?
或间隔的东西:
(?x)
(?= .* (?: ab | bc) )
.*
a? b? c?
如果将a
、b
和c
放入可递归子组中,您甚至不必重复自己。
如果我错了,请纠正我,我相信最初的问题是:对于某些正则表达式和输入字符串,如果输入字符串可能匹配(即,在字符串末尾添加更多字符可以使其匹配)。
因此,模糊匹配不是答案,因为:
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 中实现这一目标的最佳方法是什么?