首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态清洗串

动态清洗串
EN

Stack Overflow用户
提问于 2021-11-29 09:09:31
回答 2查看 62关注 0票数 0

当我学习puppeteer时,我正在抓取一个网页作为一个有趣的小项目,在这段时间里,我遇到了一个小问题,当涉及到清理字符串以获得有用的数据时。我想出了一些简单的方法来提取我想要的数据,但是我遇到了一些我不知道最好的处理方法的情况。

拿着这根绳子

Round 1 - Foo Bar (SchoolName) over John (JC) Cena (Fake School Name) (Fall 1:19)

我想要的数据。

  • 获奖者姓名= Foo Bar
  • 冠军学校= (SchoolName)
  • 失败者的名字=约翰·塞纳
  • 失败者学校=假学名

Round 1-对我来说毫无用处,它们在整个应用程序中都遵循相同的结构。因此,使用仅仅选择索引的方法应该是非常容易的。

这个字符串中最重要的索引是over所在的位置。一旦我发现了这一点,我就可以在它周围搜索索引,找出我需要的其他信息在哪里。

代码语言:javascript
复制
let findOver = arr.indexOf('over')
let winnerName = arr[over - 3].concat(' ', arr[over - 2])
let winnerSchool = summaryBreakUp[over - 1]

这适用于上面的字符串,至少在左边是这样的。它抓住得奖者的名字和姓氏,并将他们连在一起。

我的问题是,当字符串看起来不像左边时,我如何解释像上面这样的边缘情况。

我可以搜索所有的( && )并捕获其中的所有数据以获得School Names,但是接下来我需要筛选出一种方法来确定哪一所学校是一所学校,哪一所是昵称。

如有任何指示,将不胜感激。我也将张贴更多的例子,以防其他人想要破解它。

这是对未指定的对手的胜利。

Michael Macontish (Fairview) over Unknown (For.)

无圆

John Heflin (Arlington) over Random Kid (Mistview) (Fall 1:59)

不给Fall

Round 2 - Logan Paul George (High School) over Dontae Inverse (Jackson County) (Dec 3-0)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-29 09:27:00

使用regex和capture组获取您感兴趣的部分,您可能需要做一些小的整理工作。

您可以使用许多模式(我肯定这是最好的nt,但这是一个开始):

代码语言:javascript
复制
([\w\s\(\)]+)\s\(([\s\w\.]+)\)\sover\s([\w\s\(\)]+)\s\(([\s\w\.]+)\)

这与以下名称相匹配

  • 任何字母数字,下划线,空格或括号
  • 一次或多次发生

后面是括号,然后是学校

  • 任何空格、字母数字、下划线或句点
  • 一次或多次发生

后面是一个封闭的括号,然后是空格,然后是"over",然后是空格,然后重复名称和学校模式。其他的都被忽略了。

用法:在javascript中使用正则表达式时,捕获组最终成为结果数组中的元素。整个匹配是第一个元素,每个附加元素按照顺序表示捕获组。这个表达式中有4个捕获组,因此您将得到表示name1、school1、name2和school2的元素1-5。

代码语言:javascript
复制
const re = /([\w\s\(\)]+)\s\(([\s\w\.]+)\)\sover\s([\w\s\(\)]+)\s\(([\s\w\.]+)\)/

const input = [
  'Round 1 - Foo Bar (SchoolName) over John (JC) Cena (Fake School Name) (Fall 1:19)',
'Michael Macontish (Fairview) over Unknown (For.)',
'John Heflin (Arlington) over Random Kid (Mistview) (Fall 1:59)',
'Round 2 - Logan Paul George (High School) over Dontae Inverse (Jackson County) (Dec 3-0)'
]


input.forEach( i => {
   console.log(i.match(re))
})

票数 1
EN

Stack Overflow用户

发布于 2021-11-29 11:04:34

作为另一种模式,您可以使用非贪婪的点.*?来匹配任何字符或否定字符类[^以排除允许匹配的内容,从而扩大匹配范围。

可以选择地在开始时与-匹配该部分,从而启动该模式。

若要在末尾的圆括号之间匹配右部分,可以断言括号之间的部分没有-或:之间的数字之间使用负前瞻。

代码语言:javascript
复制
(?:.*?\s+-\s+)?([^()]+)\s+\(([^()]+)\)\s+over\s+(.*)\s+\((?![^()]*\d[-:]\d[^()]*\))([^()]*)\)

模式匹配:

  • (?:.*?\s+-\s+)?可选择匹配以<code> - </code>结尾的部件
  • ([^()]+)捕获组1以匹配除()以外的任何字符
  • \s+匹配1+空格字符
  • \(([^()]+)\)匹配(然后捕获组2和Match )中除()之外的任何字符。
  • \s+over\s+Match在一个或多个空格字符之间超过`
  • (.*)捕获组3中的任何字符
  • \s+匹配1+空格字符
  • \(匹配(
  • (?![^()]*\d[-:]\d[^()]*\))负前瞻,断言圆括号之间不存在:-
  • ([^()]*)如果断言为真,则捕获组4中除()之外的任何字符
  • \)匹配)

regex演示

代码语言:javascript
复制
const regex = /(?:.*?\s+-\s+)?([^()]+)\s+\(([^()]+)\)\s+over\s+(.*)\s+\((?![^()]*\d[-:]\d[^()]*\))([^()\n]*)\)/;
[
  "Round 1 - Foo Bar (SchoolName) over John (JC) Cena (Fake School Name) (Fall 1:19)",
  "Michael Macontish (Fairview) over Unknown (For.)",
  "John Heflin (Arlington) over Random Kid (Mistview) (Fall 1:59)",
  "Round 2 - Logan Paul George (High School) over Dontae Inverse (Jackson County) (Dec 3-0)"
].forEach(s => console.log(s.match(regex)));

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70152145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档