R正则表达式从文本文件中提取电视节目名称

R regular expression to extract TV show name from text file

我正在尝试使用 R 从 txt 文件中提取电视节目名称。

我已经加载了 txt 并将其分配给一个名为 txt 的变量。现在我正在尝试使用正则表达式来提取我想要的信息。

我要提取的信息模式是

SHOW: Game of Thrones 7:00 PM EST
SHOW: The Outsider 3:00 PM EST
SHOW: Don't Be a Menace to South Central While Drinking Your Juice In The Hood 10:00 AM EST

等等。大约有320个节目,我想提取所有320个。

到目前为止,我已经想到了这个。

pattern <- "SHOW:\s\w*"
str_extract_all(txt, pattern3)

但是,它并没有像我预期的那样提取整个标题名称。 (例如:它将提取“SHOW:Game”而不是“SHOW:权力的游戏”。如果我要提取那个节目,我只会使用 "SHOW:\s\w*\s\w*\s\w* 来匹配字数,但我想提取全部以txt形式显示,包括长短名字。

我应该如何编写正则表达式以获得预期的结果?

这行得通吗,使用环顾四周:

str_extract(st, '(?<=SHOW: )(.*)(?= \d{1,2}:.. [PA]M ...)')
[1] "Game of Thrones"                                                         
[2] "The Outsider"                                                            
[3] "Don't Be a Menace to South Central While Drinking Your Juice In The Hood"


 

显示:

str_extract(st, '(.*)(?= \d{1,2}:.. [PA]M ...)')
[1] "SHOW: Game of Thrones"                                                         
[2] "SHOW: The Outsider"                                                            
[3] "SHOW: Don't Be a Menace to South Central While Drinking Your Juice In The Hood"


 

数据:

st
[1] "SHOW: Game of Thrones 7:00 PM EST"                                                          
[2] "SHOW: The Outsider 3:00 PM EST"                                                             
[3] "SHOW: Don't Be a Menace to South Central While Drinking Your Juice In The Hood 10:00 AM EST"

您可以通过匹配 SHOW: 并在第一次出现 AM 或 PM 之前尽可能不匹配地捕获第 1 组中的数据,从而在不使用环视的情况下获取值。

\bSHOW:\s+(.*?)\s+\d{1,2}:\d{1,2}\s+[AP]M\b

说明

  • \bSHOW:\s+ 一个单词边界,匹配 SHOW: 和 1+ 个空白字符
  • (.*?)捕获第1组,尽可能少的匹配(非贪心)
  • \s+\d{1,2}:\d{1,2} 匹配 1+ 个空白字符,1-2 位数字 : 1-2 位数字
  • \s+[AP]M\b 匹配 1+ 个空白字符后跟 AM 或 PM 和单词边界

Regex demo | R demo

library(stringr)

txt <- c("SHOW: Game of Thrones 7:00 PM EST", "SHOW: The Outsider 3:00 PM EST", "SHOW: Don't Be a Menace to South Central While Drinking Your Juice In The Hood 10:00 AM EST")
pattern <- "\bSHOW:\s+(.*?)\s+\d{1,2}:\d{1,2}\s+[AP]M\b"
str_match(txt, pattern)[,2]

输出

[1] "Game of Thrones"                                                         
[2] "The Outsider"                                                            
[3] "Don't Be a Menace to South Central While Drinking Your Juice In The Hood"

如果你想包含SHOW,它可以是捕获组的一部分。

\b(SHOW:.*?)\s+\d{1,2}:\d{1,2}\s+[AP]M\b

Regex demo