0

首先,我不是编写正则表达式的人,所以我不能只是重写它们。我正在引入几个 Javascript 正则表达式,并尝试解析它们,但它们之间似乎存在一些差异。在 W3Schools 上测试示例正则表达式,Javascript 显示:

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 正则表达式?

4

3 回答 3

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 正则表达式模块,甚至还有一个很棒的HOWTO

于 2012-06-27T16:22:34.560 回答
1

您不想/在正则表达式中包含字符和标志,您应该使用.search而不是.match子字符串匹配。

尝试:

patt1 = re.compile(r"w3schools", flags=re.IGNORECASE)
srch = patt1.search(str)
print srch.group()
于 2012-06-27T16:24:08.307 回答
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')
# []
于 2012-06-27T17:00:57.777 回答