使用正则表达式的 R 中的字符串操作出错

String manipulation in R with regex goes wrong

我想从下面的字符串中提取以下内容:

  1. “是:考察访问” (共同出资: *([^\r\n]+?)\r\n.)

  2. “这就是你今天错过的部分。” ((?<=躯体疾病)(.*)(?=即将到来))

我下面的代码没有 return 任何东西。我在这里做错了什么?

string <- "Medfinansiering: Ja: Studiebesök\r\n Övriga synpunkter: Vi skulle anställa från Hermods YH utbildning som denna för den\r\n
är bred och ger oss kompetent personal med helhetssyn och\r\n kunskap om somatisk tillstånd, det är den delen som man saknar\r\n idag. Kommande pensionsavgångar leder till att vi behöver\r\n nyrekrytera och den andra hälften av rekryteringsbehovet beror\r\n"

str_match_all(string, regex("Medfinansiering: *([^\r\n]+?)\r\n.*?(?<=somatiska tillstånd)(.*)(?=Kommande)", dotall=T))[[1]][,-1]  

分两步:

string <- "Medfinansiering: Ja: Studiebesök\r\n Övriga synpunkter: Vi skulle anställa från Hermods YH utbildning som denna för den\r\n
är bred och ger oss kompetent personal med helhetssyn och\r\n kunskap om somatisk tillstånd, det är den delen som man saknar\r\n idag. Kommande pensionsavgångar leder till att vi behöver\r\n nyrekrytera och den andra hälften av rekryteringsbehovet beror\r\n"

sub("\\r.*", "", string)
sub("\r\n", "", sub(".*tillstånd. *(.*?) *Kommande.*", "\1", string))

您需要将模式中的 somatiska 替换为 somatisk,您可以通过将 lookbehind 模式移动到第二个捕获组中来简化模式,即 (?<=somatiska tillstånd)(.*)(somatiska tillstånd.*).

你可以使用

str_match_all(string, "(?s)Medfinansiering: *([^\r\n]+)\r\n.*?(somatisk tillstånd.*)(?=Kommande)")[[1]][,-1]

参见regex demo

详情

  • (?s) - dotall 内联修饰符
  • Medfinansiering: - 文字文本
  • * - 零个或多个空格(使用 \h*[\p{Zs}\t]* 匹配任何水平空格)
  • ([^\r\n]+) - 第 1 组:除 CR 和 LF
  • 之外的任何一个或多个字符
  • \r\n - CLRF 结尾
  • .*? - 任意 0+ 个字符,尽可能少
  • (somatisk tillstånd.*) - 第 2 组:somatisk tillstånd 然后尽可能多的任何 0+ 个字符,直到...
  • (?=Kommande) - 直到最后一次出现 Kommande