所以我正在尝试从该网站中提取事件 https://www.oldmuseum.org/ 使用正则表达式测试器。它正在工作,但是我也收到一些已售罄的事件。
这是我要使用的正则表达式。
summary-title-link">([^>]+(?!SOLD OUT))<
产生的输出:
'An Evening with Sun Kil Moon'
'Amity Dry- Fortified'
'Teeny Tiny Stevies - SOLD OUT'
'Cine Retro '
我正在努力避免出现售罄的事件。我不确定如何解决此正则表达式。
答案 0 :(得分:2)
如果仅不需要SOLD OUT文本,我们可以在其旁边添加一个简单的右边界,类似于:
df1 <- df[complete.cases(df), ]
df.split <- split(df1, df1$Site)
lapply(df.split, function(g) wilcox.test(g$y2013, g$y2017, paired=TRUE))
#$D03
# Wilcoxon signed rank test
#data: g$y2013 and g$y2017
#V = 220, p-value = 0.01681
#alternative hypothesis: true location shift is not equal to 0
#$D04
# Wilcoxon signed rank test
#data: g$y2013 and g$y2017
#V = 158, p-value = 0.0008411
#alternative hypothesis: true location shift is not equal to 0
#...
#...
第一个捕获组 summary-title-link">(.+?)(?: - SOLD OUT)<
是我们所需的标题链接,后跟一个可选的$1
。
如果不需要此表达式,可以在regex101.com中对其进行修改或更改。
jex.im还有助于可视化表达式。
- SOLD OUT
如果不完全需要SOLD OUT元素,我们可以使用类似于以下表达式的方式将其删除:
const regex = /summary-title-link">(.+?)(- SOLD OUT)?</gm;
const str = `<a href="/event/bpo29sept" class="summary-title-link">Brisbane Philharmonic Orchestra - SOLD OUT</a>
<a href="/event/bpo29sept" class="summary-title-link">Brisbane Philharmonic Orchestra - SOLD OUT</a>
<a href="/event/bpo29sept" class="summary-title-link">Brisbane Philharmonic Orchestra - SOLD OUT</a>
<a href="/event/bpo29sept" class="summary-title-link">Brisbane Philharmonic Orchestra - (Some other data)</a>`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
summary-title-link">(((?!SOLD OUT)[\s\S])*?)<\/
答案 1 :(得分:1)
只说我不希望"react:start": "react-scripts start",
"start": "run-s start:_error exit:1",
存在于我的字符串中。
SOLD OUT
按照这种模式,我们说的不是以summary-title-link">(((?!SOLD OUT).)+)<
结尾的SOLD OUT
以外的任何字符。
答案 2 :(得分:0)
这里的问题是,作为贪婪的量词,[^>]+
不仅会匹配我们想要的内容(例如“ Teeny Tiny Stevies”),还会匹配我们使用的标志“ SOLD OUT”识别不需要的物品。
因此,轮到(?!SOLD OUT)
时,它遇到了字符串的末尾(即$
),它的确不是“ SOLD OUT”,这是匹配。 / p>
以“ Teeny Tiny Stevies-售罄”为例。过程如下:
[^>]+
:尽可能匹配[^>]
,因此匹配整个字符串'Teeny Tiny Stevies-SOLD OUT'。(?!SOLD OUT)
:匹配后面没有“ SOLD OUT”的位置,并且字符串$
的末尾确实匹配。不幸的是,我无法提供一种仅用一个正则表达式就能完成我们想要的解决方案。我认为这可能是正则表达式的局限性:因为它从左到右匹配,因此向前看也许不是它的优势。
但是,我们可以使用两种正则表达式解决问题:一种用于包含,一种用于排除。
>([^>]+)<
:此正则表达式可以获取项目,尽管其中一些不需要。SOLD OUT$
相匹配,则将其踢出。可能有更好的解决方案。希望对您有所帮助。