使用 stringr 提取名称的正则表达式中的问题

Problems in a regular expression to extract names using stringr

我无法完全理解为什么我的正则表达式无法提取我想要的信息。我有一个未列出的矢量,如下所示:

   text <- c("Senator, 1.4balbal", "rule 46.1, declares",
             "Town, 24", "A Town with a Long Name, 23", "THIS IS A DOCUMENT,23)

我想创建一个正则表达式来仅提取 "Town" 的名称,即使该城镇的名称很长,如矢量中所写的名称 ("A Town with a Long Name")。我试过这个来提取城镇的名称:

   reg.town <- "[[:alpha:]](.+?)+,(.+?)\d{2}" 
   towns<- unlist(str_extract_all(example, reg.prov))

但我提取了“,”周围的所有内容。

提前致谢,

城镇名称似乎以大写字母开头 ([[:upper:]]),以逗号结尾(如果没有逗号,则继续到文本末尾)([^,]+) 和应该在输入文本的开头 (^)。在这种情况下相应的正则表达式将是:

^[[:upper:]][^,]+

演示:https://regex101.com/r/QXYtyv/1

感谢评论中@Dmitry Egorov 的演示 post,我已经解决了问题。正则表达式是这个 ([[:upper:]].+?, [[:digit:]])

感谢您的快速回复!!

您可以使用以下正则表达式:

> library(stringr)
> text <- c("Senator, 1.4balbal", "rule 46.1, declares", "Town, 24", "A Town with a Long Name, 23", "THIS IS A DOCUMENT,23")
> towns <- unlist(str_extract_all(text, "\b\p{Lu}[^,]++(?=, \d)"))
> towns
[1] "Senator"                 "Town"                   
[3] "A Town with a Long Name"

正则表达式匹配:

  • \b - 前导词边界
  • \p{Lu} - 大写字母
  • [^,]++ - , 以外的 1+ 个字符(由于 ++ 量词,没有回溯到此模式以实现更有效的匹配)
  • (?=, \d) - 一个正向前瞻,需要一个 ,,然后是一个 space,然后是在最后一个非 , 符号匹配后立即出现的任何数字[^,]++.

请注意,在启用 PCRE 选项的情况下,使用相同的正则表达式,使用基本 R 可能会得到相同的结果:

> towns_baseR <- unlist(regmatches(text, gregexpr("\b\p{Lu}[^,]++(?=, \d)", text, perl=TRUE)))
> towns_baseR
[1] "Senator"                 "Town"                   
[3] "A Town with a Long Name"
>