在原始文本中粘贴字符串字符行

时间:2015-11-08 12:18:58

标签: regex r

我处理来自扫描目录的原始文本数据。 这是一个例子:

ABADIE-LANDEL (Pierre) — 1920 — né à Paris. — 17, rue Campagne-Première   
ABOU (Albert) — 1930 — né à Marseille.  
 — 41, rue de Seine, 6e.  
ANGER (Jacques) — 1925 — né à Paris. — 33, rue Vineuse, 16e.  
ANTHONE (Armand) — 1908 — né à Paris. — 4, avenue Victor-Hugo  
 Rue des Tournelles
ANTRAL (Jean) — 1920  

这是一个包含偶尔行的名称列表,包括地址提及。

将数据导入R:

readlines ("clipboard", encoding = " latin1 ")
  • 我能够识别包含不同正则表达式的大写字母的艺术家姓名的行

[A-ZÁÀÂÄÃÅÇÉÈÊËÍÌÎÏÑÓÒÔÖÕÚÙÛÜÝYÆO][A-ZÁÀÂÄÃÅÇÉÈÊËÍÌÎÏÑÓÒÔÖÕÚÙÛÜÝYÆO |']

或(ICU)

[\p{Uppercase Letter}][\p{Uppercase Letter}|']

  • 我能识别包括艺术品在内的一行

^ [0-9] + [\ s] [^ bis]`

  • 我能够提取艺术家姓名

".+(?=- [0-9]{4})"

(.+)[0-9]{4}.+ # with backreference \1

我希望我可以粘贴地址子串,但我的最终目标是创建一个data.frame对象,结构如下:

第1栏:NAME艺术家和姓氏;
第二栏:补充(地址,国籍......)
第3栏:工作或更好......
第3栏:1工作
第4栏2工作等

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你想从你的记录中提取名称和地址,其中一些可能跨越不同的行。

一种解决方案可能是利用角色作为字段分隔符的事实。因此,假设您的记录结构是常规的,您可以这样做:

(数据是保存示例字符串的变量)

## Replace newlines with the separator character 
data <- gsub("\\n(\\s*—)?", " — ", data)

## Normalize space
data <- gsub("\\s+", " ", data)

## Now split by the separator character
tokens <- strsplit(data, "\\s—\\s")[[1]]

令牌现在包含:

[1] "ABADIE-LANDEL (Pierre)"    "1920"                      "né à Paris."               "17, rue Campagne-Première" "ABOU (Albert)"
[6] "1930"                      "né à Marseille."           "41, rue de Seine, 6e."     "ANGER (Jacques)"           "1925"
[11] "né à Paris."               "33, rue Vineuse, 16e."     "ANTHONE (Armand)"          "1908"                      "né à Paris."
[16] "4, avenue Victor-Hugo"     "Rue des Tournelles"        "ANTRAL (Jean)"             "1920"

每个完整记录在此向量中应该有4个连续索引,但由于记录可能不完整,我们必须多做一些。

我们利用这样一个事实,即人们的名字都是大都会,并遵循严格的模式。我们在tokens中获取名称的索引,然后在这些索引上拆分tokens。所生成的每个子向量现在都是完整的记录:

## Get the indices of names
idx <- which(grepl("^[A-Z-]+\\s\\(", tokens))

## Use the indices to partition tokens to subvectors
records <- list()

for (i in 1:length(idx)) {
    start <- idx[i]
    if (i == length(idx)) {
        stop <- length(tokens)
    }
    else {
        stop <- idx[i+1] - 1
    }

    records[[i]] <- tokens[start:stop]
}

以下是最终的结果列表:

[[1]]
[1] "ABADIE-LANDEL (Pierre)"    "1920"                      "né à Paris."               "17, rue Campagne-Première"

[[2]]
[1] "ABOU (Albert)"         "1930"                  "né à Marseille."       "41, rue de Seine, 6e."

[[3]]
[1] "ANGER (Jacques)"       "1925"                  "né à Paris."           "33, rue Vineuse, 16e."

[[4]]
[1] "ANTHONE (Armand)"      "1908"                  "né à Paris."           "4, avenue Victor-Hugo" "Rue des Tournelles"

[[5]]
[1] "ANTRAL (Jean)" "1920"

希望这有助于或带来更好的想法。