这是我第一次使用正则表达式,我有一些问题,希望你能帮助我找到答案。 我们举一个数据的例子:
chartData.push({
date: newDate,
visits: 9710,
color: "#016b92",
description: "9710"
});
var newDate = new Date();
newDate.setFullYear(
2007,
10,
1 );
我想要检索的是得到日期,这是最后一个括号和相应的描述。 我不知道如何用一个正则表达式来做,因此我决定将它一分为二。
第一部分:
我检索description:
后面的值。 这是用以下代码管理的:[\n\r].*description:\s*([^\n\r]*)
输出给我的结果带有一个引号“9710”
,但我可以公平地说,它是正确的,不需要更改。
第二部分:
这就变得棘手了。 我想检索文本newdate.SetFullYear
后面括号中的值。 不幸的是,到目前为止,我只得到括号内的值。 为此,我使用了以下代码\(([^)]*)\)
。结果是它选择了示例中的所有3个括号:
"{
date: newDate,
visits: 9710,
color: "#016b92",
description: "9710"
}",
"()",
"2007,
10,
1 "
我缺少的是一个用于REGEX的AND运算符,它允许我构造一个代码,允许检索特定文本后面括号中的数据。
当然,我可以选择每第三个结果,但不幸的是,它不能对整个数据集起作用。
你们中有人知道如何解决第二部分的问题吗?
提前谢谢你。
可以使用以下表达式:
res = re.search(r'description: "([^"]+)".*newDate.setFullYear\((.*)\);', text, re.DOTALL)
这将返回一个包含两个组的正则表达式匹配对象,您可以使用以下方法获取该对象:
res.groups()
结果是:
('9710', '\n2007,\n10,\n1 ')
当然,您可以以您想要的任何方式解析这些组。 例如:
date = res.groups()[1]
[s.strip() for s in date.split(",")]
==>
['2007', '10', '1']
您所提到的AND部分并不是真正的运算符。 该模式从左到右匹配字符,因此在捕获组1中的值之后,在捕获组2中的值之前,您将冷匹配所有出现的字符。
您可以重复匹配以下所有不以newdate.setFullYear(
开头的行
然后,当您确实遇到该值时,匹配它并在组2中捕获匹配除括号之外的所有字符。
\r?\ndescription: "([^"]+)"(?:\r?\n(?!newDate\.setFullYear\().*)*\r?\nnewDate\.setFullYear\(([^()]+)\);
Regex演示Python演示
示例代码
import re
regex = r"\r?\ndescription: \"([^\"]+)\"(?:\r?\n(?!newDate\.setFullYear\().*)*\r?\nnewDate\.setFullYear\(([^()]+)\);"
test_str = ("chartData.push({\n"
"date: newDate,\n"
"visits: 9710,\n"
"color: \"#016b92\",\n"
"description: \"9710\"\n"
"});\n"
"var newDate = new Date();\n"
"newDate.setFullYear(\n"
"2007,\n"
"10,\n"
"1 );")
print (re.findall(regex, test_str))
输出量
[('9710', '\n2007,\n10,\n1 ')]