提问者:小点点

使用正则表达式查找值(包括括号)


这是我第一次使用正则表达式,我有一些问题,希望你能帮助我找到答案。 我们举一个数据的例子:

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运算符,它允许我构造一个代码,允许检索特定文本后面括号中的数据。

当然,我可以选择每第三个结果,但不幸的是,它不能对整个数据集起作用。

你们中有人知道如何解决第二部分的问题吗?

提前谢谢你。


共2个答案

匿名用户

可以使用以下表达式:

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 ')]