首先,我不是正在编写正则表达式的人,因此我不能只重写它们。我正在使用几个Javascript regexp,并尝试解析它们,但它们之间似乎存在一些差异。在W3Schools上测试示例regexp,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版?
答案 0 :(得分:3)
在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。
答案 1 :(得分:1)
您不希望在正则表达式中包含/
字符和标记,并且您应该使用.search
而不是.match
进行子字符串匹配。
尝试:
patt1 = re.compile(r"w3schools", flags=re.IGNORECASE)
srch = patt1.search(str)
print srch.group()
答案 2 :(得分: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')
# []