Python和Javascript在评估正则表达式方面的区别

Posted

技术标签:

【中文标题】Python和Javascript在评估正则表达式方面的区别【英文标题】:Difference between Python and Javascript in evaluating a regular expression 【发布时间】:2012-02-02 06:25:53 【问题描述】:

首先,这不是this question的骗子。

javascript 中,这个表达式的计算似乎是正确的:

\\/(omniture|mbox|hbx|omniunih)(.*)?

如果我将它传递给 Python re 模块,就会发生不好的事情。实际上,以下返回错误:

import re
re.compile (u'\\/(omniture|mbox|hbx|omniunih)(.*)?')

In [101]: re.compile (u'\\/(omniture|mbox|hbx|omniunih)(.*)?')
---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
/home/fakk/spider.io/1/<ipython-input-101-b5b19eb3b66e> in <module>()
----> 1 re.compile (u'\\/(omniture|mbox|hbx|omniunih)(.*)?')

/usr/lib/python2.7/re.pyc in compile(pattern, flags)
    188 def compile(pattern, flags=0):
    189     "Compile a regular expression pattern, returning a pattern object."
--> 190     return _compile(pattern, flags)
    191 
    192 def purge():

/usr/lib/python2.7/re.pyc in _compile(*key)
    242         p = sre_compile.compile(pattern, flags)
    243     except error, v:
--> 244         raise error, v # invalid expression
    245     if len(_cache) >= _MAXCACHE:
    246         _cache.clear()

error: nothing to repeat

Python 抱怨 (.*)? 部分,我自己也无法理解。

我的问题是:

    (.*)? 在 JS 中有什么作用?匹配零个或一个 (?) 零个或多个 (*) 字符 (.)?有什么意义? 如何在 Python 中翻译它?

【问题讨论】:

“Python 抱怨 (.*)? 部分” - 你能发布错误信息吗? (我猜是“错误:没什么可重复的”,对吧?) 你成功了 :) 实际上,没有什么可重复的。其他失败的表达式有:\/webtrends(.*)?\.jsforesee-(trigger(.*)?|alive|analytics(.*)?)\.jseverestjs\.net|pixel([0-9]*)?\.everesttech\.net (.*)? . 代表任何字符,* 意味着可以有尽可能多的字符,就像你想要的那样(在这种情况下是任何字符),方括号表示其中的内容是组,? 表示之前的内容可以存在但不能存在(在这种情况下,它意味着括号中的所有内容都不能存在) 【参考方案1】:

您的正则表达式没有意义,字符串末尾的? 是不需要的,实际上永远不会匹配任何内容。另外我建议你使用r'' 让你的表达更容易阅读:

import re
my_regex = re.compile(r'\/(omniture|mbox|hbx|omniunih)(.*)')

【讨论】:

【参考方案2】:

问号是多余的,当你反映自己时,它并没有任何意义,去掉它,你应该做生意了。

【讨论】:

只是为了澄清,这是多余的,但并非完全不正确,比较这个.?.?.*。 Python 处理不了,有点奇怪。 实际上,这里有一些比? 更微妙的东西。这也是多余的?:(.?)?,不过python似乎并不介意。我尝试查看 sre_compile/sre_parse 代码以找出交易是什么,但对于堆栈溢出问题来说有点费力;)

以上是关于Python和Javascript在评估正则表达式方面的区别的主要内容,如果未能解决你的问题,请参考以下文章

javascript 正则表达式[第1部分] - 评估函数

Python 和 Javascript 正则表达式有啥不同?

使用 python 和 javascript 的慢正则表达式,但在 go 和 php 中快速失败

Perl 正则表达式替换,环境变量评估

正则表达式未按预期进行评估

python开发中对正则表达式及re模块的学习