有没有一种方法可以在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+)"
型
9条答案
按热度按时间2admgd591#
字符串
正则表达式|'运算符与每个子表达式的单独运行
txu3uszq2#
https://www.debuggex.com也很不错。它是一个在线Python(和其他几种语言)调试器,它对匹配和不匹配有一个非常整洁的可视化。如果您需要快速起草一个regexp,这是一个非常好的资源。
sdnqo3pr3#
为什么不使用一些regEx工具(我通常使用Regulator)并在那里测试regex-expression,当您满意时,只需将其复制/粘贴到代码中。
ljo96ir54#
我经常使用RegexPal进行快速检查(一个在线正则表达式原型)。它列出了许多常见的表达式沿着一个简单的表达式。当你没有一个专用的工具,只是需要一个快速的方法来计算一个简单的正则表达式时,它非常方便。
1aaf6o9v5#
我不确定是否可以直接在Python中执行这样的操作,但我可以肯定地建议使用RegEx编辑器工具。反正这可能是你最好的选择了。就我个人而言,我使用过The Regulator,发现它非常有用。其他一些在这个SO线程中列出。
ru9i0ody6#
与前面提到的类似,还有Regexbuddy
chhkpiq47#
RegexBuddy所拥有的是其他工具所没有的一个内置的debugger,它向您展示了成功和失败的匹配尝试的整个匹配过程。其他工具只显示最终结果(RegexBuddy也可以显示)。
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 debug
和use 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的例子,会被皱眉头。pdkcd3nj9#
有人能解释一下我的,为什么大家都说不可能?在我看来非常非常简单:
字符串
当然,这对团体来说并不好,但总比没有强