2012-01-04 29 views
3

首先,這不是this question的騙局。Python和Javascript之間在評估正則表達式上的區別

在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抱怨的(.*)?部分,這我自己也無法理解。

我的問題是:

  1. 是什麼(.*)?做JS?匹配零個或多個(?)零個或多個(*)個字符(.)?重點是什麼?
  2. 如何在Python中翻譯它?
+2

「Python抱怨(。*)?部分」 - 你能發佈錯誤信息嗎? (我想這是「錯誤:沒有重複」,對吧?) – 2012-01-04 10:38:17

+0

當然,我會更新文章 – Jir 2012-01-04 10:39:11

+0

你釘了它:)其實,沒有什麼可重複的。其他表達失敗的是:'\/webtrends(。*)?\。js','foresee-(trigger(。*)?| alive | analytics(。*)?)\。js','everestjs \ .net |像素([0-9] *)\ everesttech \ .net'?。 – Jir 2012-01-04 10:45:32

回答

6

問號是多餘的,因爲你反映自己,它沒有任何意義,刪除它,你應該在業務。

+0

只是爲了澄清,這是多餘的,但不是嚴格的不正確,比較這個'。?。?。*'。 Python無法處理它有點奇怪。 – zrvan 2012-01-04 10:54:50

+0

事實上,這裏有一些比這個'''多餘的東西更微妙的東西。這也是一個多餘的'?':'(。?)?',但是Python似乎並不介意。我試圖通過sre_compile/sre_parse代碼來找出交易是什麼,但是對於堆棧溢出問題,這是一個很大的努力;) – jjm 2012-03-19 07:27:27

2

您的正則表達式沒有意義,您的字符串末尾的?不需要,實際上也不會匹配任何內容。另外,我建議你使用r''來使你的表達更容易閱讀:

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