RegEx用于提取部分HTML元素

时间:2019-05-21 02:25:40

标签: regex regex-negation regex-lookarounds regex-group regex-greedy

所以我正在尝试从该网站中提取事件 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 '

我正在努力避免出现售罄的事件。我不确定如何解决此正则表达式。

3 个答案:

答案 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

enter image description here

RegEx

如果不需要此表达式,可以在regex101.com中对其进行修改或更改。

RegEx电路

jex.im还有助于可视化表达式。

enter image description here

演示

- 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}`);
    });
}

enter image description here

Demo

JavaScript测试

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以外的任何字符。

Demo

答案 2 :(得分:0)

原因

这里的问题是,作为贪婪的量词,[^>]+不仅会匹配我们想要的内容(例如“ Teeny Tiny Stevies”),还会匹配我们使用的标志“ SOLD OUT”识别不需要的物品。

因此,轮到(?!SOLD OUT)时,它遇到了字符串的末尾(即$),它的确不是“ SOLD OUT”,这是匹配。 / p>

以“ Teeny Tiny Stevies-售罄”为例。过程如下:

  1. [^>]+:尽可能匹配[^>],因此匹配整个字符串'Teeny Tiny Stevies-SOLD OUT'。
  2. (?!SOLD OUT):匹配后面没有“ SOLD OUT”的位置,并且字符串$的末尾确实匹配。

解决方案

不幸的是,我无法提供一种仅用一个正则表达式就能完成我们想要的解决方案。我认为这可能是正则表达式的局限性:因为它从左到右匹配,因此向前看也许不是它的优势。

但是,我们可以使用两种正则表达式解决问题:一种用于包含,一种用于排除。

  1. >([^>]+)<:此正则表达式可以获取项目,尽管其中一些不需要。
  2. 如果项目与SOLD OUT$相匹配,则将其踢出。

可能有更好的解决方案。希望对您有所帮助。