我在Python中使用正则表达式来搜索页面源,并在javascript中查找所有json信息。具体来说,一个例子看起来像这样:
var fooData = { id: 123456789, name : "foo bar", country_name: "foo", country_is_eu: null, foo_bars: null, foo_email: null, foo_rate: 1.0, foo_id: 0987654321 };
我很了解所有关于正则表达式的知识,而且我不确定我所做的是否正确。我可以得到一些单独的行,但我不完全确定如何使用re.MULTILINE。这是我现在的代码:
prog = re.compile('[var ]?\w+ ?= ?{[^.*]+\n};', re.MULTILINE)
vars = prog.findall(text)
为什么这不起作用?
为了更清楚,我真的需要它来匹配这些括号之间的所有内容,如下所示:
var fooData = { };
所以,基本上我找不到匹配每一行的方法,除了看起来像这样的一行:
};
答案 0 :(得分:2)
您正在寻找的不包括括号:
(?<=var fooData = {)[^}]+(?=};)
答案 1 :(得分:0)
如果您不确定,请务必查阅文档(这对Python非常有用)。
multi-line mode生成以插入符号(^)开头并以($)结尾的正则表达式,以匹配每个相应行的开头和结尾(其中“行”是紧跟在换行符之后的任何内容{ {1}})。
看起来你已经在你的正则表达式的开头和结尾都有\n
s并且你正在使用\n
函数来解决这个问题。
答案 2 :(得分:0)
我明白了!事实证明甚至不需要多线模式,我只是将所有未在;
中结束的行匹配在括号之间。我还略微修改了正则表达式以找到括号等,这是我的代码:
re.findall('(?:var )?\w+[ ]?=[ ]?{\n(?:.+(?!(?<=;))\n)+};', text)
感谢X.Jacobs,我简化(并修复了)我的代码:
re.findall('(?:var )?\w+\s*=\s*{[^;]+};', text)