あなたがgsub
使用することができます。
df$movies2 = gsub("^([\\w\\s]+),*\\s*([Tt]he*($|(?=\\s\\(\\d{4}\\))))", "\\2 \\1", df$movies, perl = TRUE)
結果:
> df
movies movies2
1 Shawshank Redemption, The (1994) The Shawshank Redemption (1994)
2 Godfather II, The The Godfather II
3 Band of Brothers Band of Brothers
4 Dora, The Explorer Dora, The Explorer
5 Kill Bill Vol. 2 The Kill Bill Vol. 2 The
6 ,The Highlander ,The Highlander
7 Happening, the the Happening
データ:
を
df = data.frame(movies = c("Shawshank Redemption, The (1994)",
"Godfather II, The",
"Band of Brothers",
"Dora, The Explorer",
"Kill Bill Vol. 2 The",
",The Highlander",
"Happening, the"), stringsAsFactors = FALSE)
の
注:
正規表現全体の目標はグループに最初の部分(,
前の部分)と第二の部分(「」,
後とする場合にのみ、それは終わりか(year)
前だ)であります私は、文字列の先頭から\\2
と\\1
^([\\w\\s]+)
マッチ任意の単語文字またはスペース1回以上と交換することができ、別のキャプチャグループに 本の
,*\\s*
マッチコンマとスペースの両方がゼロ回以上
[Tt]he*
マッチ「の文字列の末尾」に一致それは($|(?=\\s\\(\\d{4}\\)))
が続いていることを「a」または「an」は、ゼロ回以上
- 注意、
$
、又は前のパターンの後に前のパターンが続いているかどうかをチェックする肯定的な先読みは、括弧を含む(4 digits)
に一致します。ダブルバックスラッシュを単一のバックスラッシュ
- を逃れるために必要とされているので、
([Tt]he*($|(?=\\s\\(\\d{4}\\))))
マッチ「」または「」文字列の末尾か、括弧で(4 digits)
- すべてが続いているかのどちらかをキャプチャグループなので、
\\2 \\1
は、最初のスワップ"012"が[Tt]he*
で0回以上しか一致しないため、文字列に "The"が含まれていない場合、空の文字列がスワップされます。\\1
元の文字列を返します。
カンマの後に2つの「The」がありますが、2番目のカンマの後に移動しました。それで、それは両方か唯一ですか? – useR
文章をRで印刷する方法を更新しました。これが理にかなっているかどうかを確認してください。 – ckdf14