【问题标题】:How to parse a Javascript regexp in Python?如何在 Python 中解析 Javascript 正则表达式?
【发布时间】:2012-06-29 03:39:57
【问题描述】:

首先,我不是编写正则表达式的人,所以我不能只是重写它们。我正在引入几个 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 正则表达式?

【问题讨论】:

标签: javascript python regex


【解决方案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')
# []

【讨论】:

  • 这不适用于具有命名组的正则表达式。不幸的是,命名组的 JS 风格与 Python 中的不同。
  • @RJH 不确定我是否在关注 - 你能举个例子说明它在哪里不起作用吗?
【解决方案2】:

在python中.match只匹配字符串的开头

你想使用的是.search

此外,您不需要包含“/”字符,并且您需要使用单独的参数来重新编译以使搜索不区分大小写:

>>> 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

【讨论】:

    【解决方案3】:

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

    试试:

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

    【讨论】:

      猜你喜欢
      • 2010-10-23
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      • 2011-06-05
      • 2012-09-12
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多