debugging 如何在Python中调试正则表达式?

zf2sa74q  于 2023-08-06  发布在  Python
关注(0)|答案(9)|浏览(103)

有没有一种方法可以在Python中调试正则表达式?我不是指尝试和尝试直到他们工作的过程:)
下面是如何在Perl中调试正则表达式:

use re 'debug';

my $str = "GET http://some-site.com HTTP/1.1";
if($str =~/get\s+(\S+)/i) {
    print "MATCH:$1\n";
}

字符串
上面的代码在我的计算机上运行时产生以下输出:

Compiling REx "get\s+(\S+)"
Final program:
   1: EXACTF  (3)
   3: PLUS (5)
   4:   SPACE (0)
   5: OPEN1 (7)
   7:   PLUS (9)
   8:     NSPACE (0)
   9: CLOSE1 (11)
  11: END (0)
stclass EXACTF  minlen 5
Matching REx "get\s+(\S+)" against "GET http://some-site.com HTTP/1.1"
Matching stclass EXACTF  against "GET http://some-site.com HTTP/1.1" (33 chars)
   0           |  1:EXACTF (3)
   3        |  3:PLUS(5)
                                  SPACE can match 1 times out of 2147483647...
   4       |  5:  OPEN1(7)
   4       |  7:  PLUS(9)
                                    NSPACE can match 20 times out of 2147483647...
  24       |  9:    CLOSE1(11)
  24       | 11:    END(0)
Match successful!
MATCH:http://some-site.com
Freeing REx: "get\s+(\S+)"

2admgd59

2admgd591#

>>> p = re.compile('.*', re.DEBUG)
max_repeat 0 65535
  any None
>>>

字符串
正则表达式|'运算符与每个子表达式的单独运行

txu3uszq

txu3uszq2#

https://www.debuggex.com也很不错。它是一个在线Python(和其他几种语言)调试器,它对匹配和不匹配有一个非常整洁的可视化。如果您需要快速起草一个regexp,这是一个非常好的资源。

sdnqo3pr

sdnqo3pr3#

为什么不使用一些regEx工具(我通常使用Regulator)并在那里测试regex-expression,当您满意时,只需将其复制/粘贴到代码中。

ljo96ir5

ljo96ir54#

我经常使用RegexPal进行快速检查(一个在线正则表达式原型)。它列出了许多常见的表达式沿着一个简单的表达式。当你没有一个专用的工具,只是需要一个快速的方法来计算一个简单的正则表达式时,它非常方便。

1aaf6o9v

1aaf6o9v5#

我不确定是否可以直接在Python中执行这样的操作,但我可以肯定地建议使用RegEx编辑器工具。反正这可能是你最好的选择了。就我个人而言,我使用过The Regulator,发现它非常有用。其他一些在这个SO线程中列出。

ru9i0ody

ru9i0ody6#

与前面提到的类似,还有Regexbuddy

chhkpiq4

chhkpiq47#

RegexBuddy所拥有的是其他工具所没有的一个内置的debugger,它向您展示了成功和失败的匹配尝试的整个匹配过程。其他工具只显示最终结果(RegexBuddy也可以显示)。

8iwquhpp

8iwquhpp8#

我100%赞同Geo re在vanilla Python 3中进行板载正则表达式调试的需要,就像在vanilla Perl 5中一样。
尽管Python3很好,而且在3.11.4中它确实很好,但它仍然不如Perl 5好。差不多了,但没有雪茄。不幸的是,Python社区对任何批评都React过度。通常的回答是这样的:“你为什么要这样做?只要用Python的方式去做就行了。”除非你是个新手,否则这并没有多大帮助。如果你是一个有经验的Perl程序员,你可能因为老板的命令而学习Python。或者,如果您是一个经验丰富的Perl负责人,您可能只是自愿这样做,以了解所有的宣传是关于什么的,或者决定是否是时候离开Perl了。(剧透提醒:它不是。)
use re debuguse re debugcolor非常有用。为什么呢?因为有些问题用正则表达式来解决并不简单。我能想到我用正则表达式解决的问题,会给予杰弗里·弗里德尔犹豫。这两个use使用案例可帮助您解决问题。它们不仅可以帮助您调试无法匹配的正则表达式(即使您确信它应该匹配),还可以帮助您优化正在工作的正则表达式,使其变得更好,可能从O(N)到O(N-1)。
所有这些关于Python中只有一种正确的方法的“东西”(不能在堆栈溢出上使用糟糕的语言)都是胡说八道。只要Python能让用C、Fortran和,呃!、C++)Python也支持TMTOWTDI。
最后一点:我相信RegexBuddy只在Windoze上运行。我不会仅仅为了进行正则表达式调试而在VirtualBox中运行Windoze示例(我是一个macOS和Linux用户)。至少对我来说,更好的方法是在Perl 5中开发一个复杂的正则表达式,然后在证明它有效后将其移植到Python3中,显然要利用这两个用例。为此,我将Python3代码放在__END__之后(嗯,Python中缺少的另一个有用的构造),用vim block命令注解掉Perl代码,并打乱shebangs来切换程序。我想这是另一个TMTOWTDI的例子,会被皱眉头。

pdkcd3nj

pdkcd3nj9#

有人能解释一下我的,为什么大家都说不可能?在我看来非常非常简单:

regex_string = r"Hello \w\w name .[a-z] funny\d\d[a-z]3"
text = "Hello my name is funny0123"

full_break = False
for ind_regex in list(range(len(regex_string)))[::-1]:
    try:
        regex = re.compile(regex_string[:ind_regex])
    except re.error:
        # no valid regex
        continue
    for ind_text in list(range(len(text)))[::-1]:
        if regex.match(text[:ind_text]):
            print(regex_string[:ind_regex])
            print(text[:ind_text])
            full_break = True
            break
    if full_break:
        break

字符串
当然,这对团体来说并不好,但总比没有强

相关问题