我可以显示Python正则表达式最多匹配到的位置吗?

我可以显示Python正则表达式最多匹配到的位置吗?,python,regex,Python,Regex,所以我有一个很长的输入字符串,我用一个正则表达式从中提取了几位数据。输入是由客户机提供的,他们经常忘记重要的部分,这些部分不仅是正则表达式匹配所必需的(它们是),而且它们是正则表达式构建的数据库的组成部分 我希望能够指出在输入中匹配从何处开始失败以及为什么失败(向他们展示正则表达式接下来期望的内容) 性能是一个问题。正则表达式包含多个字段,因此将其分解为多个单独的正则表达式匹配可能是禁止的 以下是真实事物的简化版本: ^(?:(?P<doors>\d) Doors).*(?P<

所以我有一个很长的输入字符串,我用一个正则表达式从中提取了几位数据。输入是由客户机提供的,他们经常忘记重要的部分,这些部分不仅是正则表达式匹配所必需的(它们是),而且它们是正则表达式构建的数据库的组成部分

我希望能够指出在输入中匹配从何处开始失败以及为什么失败(向他们展示正则表达式接下来期望的内容)

性能是一个问题。正则表达式包含多个字段,因此将其分解为多个单独的正则表达式匹配可能是禁止的

以下是真实事物的简化版本:

^(?:(?P<doors>\d) Doors).*(?P<transmission>Automatic|Manual)

您的问题太广泛,Python正则表达式引擎无法处理。您需要一个有限自动机引擎(更具体的NFA),编写您自己的解析器并输入字符串,然后查看它失败的地方和原因

或者,您可以使用创建语法(在中可以找到大量示例),类似
. 如果您是PyParsing的新手,学习曲线会很陡峭,但一旦您掌握了这个概念,实现您想要的将是一个轻松的过程。

您的问题太广,Python正则表达式引擎无法处理。您需要一个有限自动机引擎(更具体的NFA),编写您自己的解析器并输入字符串,然后查看它失败的地方和原因

或者,您可以使用创建语法(在中可以找到大量示例),类似
. 如果您是PyParsing的新手,学习曲线会很陡峭,但是一旦您掌握了这个概念,实现您想要的将是一次轻松的体验。

编写解析器的想法(从我的JavaCC时代到现在至少已经10年了)让我觉得有点毛茸茸的,我不相信它比运行一堆编译过的正则表达式更快。。。然而,我认为我已经找到了一个合适的解决办法

我们首先使用一个单一的正则表达式,如果失败了,我们将使用增量正则表达式。如果失败率很低,这根本不应该是性能问题

REGEXES = [
    (r'(?:(?P<doors>\d) Doors)', 'doors'),
    (r'.*(?P<transmission>Automatic|Manual)', 'transmission'),
]
FAILS = [(re.compile('^' + r[0], re.IGNORECASE), r[1]) for r in REGEXES]
MATCHER = re.compile('^' + ''.join([r[0] for r in REGEXES]), re.IGNORECASE)


# ... later ...

m = MATCHER.match(input)

if not m:
    working = input
    for r in FAILS:
        s = r[0].split(input)
        if len(s) > 1:
            working = s[-1]  # we use last group in the split
            continue
        # we have a problem here!!
        # we know the group (the regex and the label we gave it)
        # we can show the user what we're trying to match and against what
        return blah

# otherwise we can start working with m's groups.
regex=[
(r’(?:(?P\d)Doors)‘Doors’,
(r.*(?自动|手动)‘变速器’),
]
对于正则表达式中的r,失败=[(重新编译('^'+r[0],重新初始化),r[1])]
MATCHER=re.compile('^'+''.join([r[0]表示正则表达式中的r]),re.IGNORECASE)
# ... 后来。。。
m=匹配器。匹配(输入)
如果不是m:
工作=输入
对于r in故障:
s=r[0]。拆分(输入)
如果长度>1:
working=s[-1]#我们使用拆分中的最后一组
持续
#我们这里有个问题!!
#我们知道这个组(正则表达式和我们给它的标签)
#我们可以向用户展示我们试图匹配的内容以及与之相对的内容
回音
#否则我们可以开始与m的团队合作。

编写解析器的想法(我的JavaCC时代已经过去至少10年了)让我觉得有点不自在,我不认为它比运行一堆编译过的正则表达式更快。。。然而,我认为我已经找到了一个合适的解决办法

我们首先使用一个单一的正则表达式,如果失败了,我们将使用增量正则表达式。如果失败率很低,这根本不应该是性能问题

REGEXES = [
    (r'(?:(?P<doors>\d) Doors)', 'doors'),
    (r'.*(?P<transmission>Automatic|Manual)', 'transmission'),
]
FAILS = [(re.compile('^' + r[0], re.IGNORECASE), r[1]) for r in REGEXES]
MATCHER = re.compile('^' + ''.join([r[0] for r in REGEXES]), re.IGNORECASE)


# ... later ...

m = MATCHER.match(input)

if not m:
    working = input
    for r in FAILS:
        s = r[0].split(input)
        if len(s) > 1:
            working = s[-1]  # we use last group in the split
            continue
        # we have a problem here!!
        # we know the group (the regex and the label we gave it)
        # we can show the user what we're trying to match and against what
        return blah

# otherwise we can start working with m's groups.
regex=[
(r’(?:(?P\d)Doors)‘Doors’,
(r.*(?自动|手动)‘变速器’),
]
对于正则表达式中的r,失败=[(重新编译('^'+r[0],重新初始化),r[1])]
MATCHER=re.compile('^'+''.join([r[0]表示正则表达式中的r]),re.IGNORECASE)
# ... 后来。。。
m=匹配器。匹配(输入)
如果不是m:
工作=输入
对于r in故障:
s=r[0]。拆分(输入)
如果长度>1:
working=s[-1]#我们使用拆分中的最后一组
持续
#我们这里有个问题!!
#我们知道这个组(正则表达式和我们给它的标签)
#我们可以向用户展示我们试图匹配的内容以及与之相对的内容
回音
#否则我们可以开始与m的团队合作。


您能提供一个更容易理解的例子吗?匹配不会“开始失败”。正则表达式要么匹配,要么不匹配。@Tichodroma:参考商业解决方案,如或@Tichodroma。我不是在讨论我要实现的目标的正确命名法,我只是想让它工作。一定要纠正我,把我推向正确的方向,但我想我要做的很清楚。你是在说这样的事情吗?你能提供一个更容易理解的例子吗?匹配不会“开始失败”。正则表达式要么匹配,要么不匹配。@Tichodroma:参考商业解决方案,如或@Tichodroma。我不是在讨论我要实现的目标的正确命名法,我只是想让它工作。一定要纠正我,把我推向正确的方向,但我想我要做的很清楚。你是在说这样的事情吗?我不相信,对于这样一个简单的问题范围,解析器会比把正则表达式分块更快。我添加了一个示例,展示了分块是如何工作的。Pyparsing不再托管在wikispaces.com上。Go to I'm not sell no的前提是,对于这样一个简单的问题范围,解析器比将正则表达式分块更快。我添加了一个示例,展示了分块是如何工作的。Pyparsing不再托管在wikispaces.com上。转到解析器速度更快,因为需要编译正则表达式及其特定部分(因为正则表达式正在拆分),而解析器已经编译,并且可以在到达无效点时指出错误。如果可以单独定义条件(类似于密码验证的方式),这将非常有用,因此,我们可以分别测试每个条件并返回有意义的反馈。但是,如果条件不能分开,那么就很难解释正则表达式失败的原因,因为有很多点它会停止并必须回溯。解析器速度更快,因为正则表达式及其特定部分(因为