2012-06-27 73 views
0

首先,我不是正在編寫正則表達式的人,所以我不能只重寫它們。我拉幾個Javascript正則表達式,並試圖解析它們,但它們之間似乎有一些區別。測試在W3Schools的例子正則表達式,使用Javascript表明這一點:如何解析Python中的Python正則表達式?

var str="Visit W3Schools"; 
var patt1=/w3schools/i; 
alert(str.match(patt1)) 

它提醒 「W3Schools的」。然而,在Python中,我得到:

import re 
str="Visit W3Schools" 
patt1=re.compile(r"/w3schools/i") 
print patt1.match(str) 

哪打印None。 是否有一些庫可以用來將Javascript正則表達式轉換爲Python的正則表達式?

+0

查找'.match'與'.search'。 –

+0

[請小心使用w3schools。](http://w3fools.com) – Pointy

回答

1

可以寫一個小的輔助功能,從而/ IG也可以工作:

def js_to_py_re(rx): 
    query, params = rx[1:].rsplit('/', 1) 
    if 'g' in params: 
     obj = re.findall 
    else: 
     obj = re.search 

    # May need to make flags= smarter, but just an example...  
    return lambda L: obj(query, L, flags=re.I if 'i' in params else 0) 

print js_to_py_re('/o/i')('school') 
# <_sre.SRE_Match object at 0x2d8fe68> 

print js_to_py_re('/O/ig')('school') 
# ['o', 'o'] 

print js_to_py_re('/O/g')('school') 
# [] 
+0

謝謝,這工作得很好! – Skyler

+0

這對於具有命名組的正則表達式不起作用。不幸的是,命名組的JS風格與Python中的不同。 – RJH

+0

@RJH不知道我在追隨 - 你能提供一個它不起作用的例子嗎? –

3

python .match只匹配在字符串的開頭。您要使用的是.search

而且,你不必包含「/」字符,你需要使用一個單獨的參數re.compile使搜索不區分大小寫:

>>> import re 
>>> str = "Visit W3Schools" 
>>> patt1 = re.compile('w3schools', re.I) 
>>> print patt1.search(str) 
<_sre.SRE_Match object at 0x10088e1d0> 

在JavaScript中,斜槓是相當於撥打re.compile

我可以推薦閱讀python regular expression module,甚至還有優秀的HOWTO

+0

+1。對於'.match' vs'.search' – AliBZ

1

你不想要在正則表達式的/人物和標誌,你應該使用.search而不是.match的字符串匹配。

嘗試:

patt1 = re.compile(r"w3schools", flags=re.IGNORECASE) 
srch = patt1.search(str) 
print srch.group()