2017-04-02 8 views
0

次のコード行の正規表現が何を意味しているのか理解できません。rのsubとgsubの正規表現の解析

author = "10_1 A Kumar; Ahmed Hemani ; Johnny &Ouml;berg<" 

# after some experiment, it looks like this line captures whatever is in 
# front of the underscore. 
authodid = sub("_.*","",author) 

# this line extracts the number after the underscore, but I don't know 
# how this is achieved 
paperno <- sub(".*_(\\w*)\\s.*", "\\1", author) 

# this line extracts the string after the numbers 
# I also have no idea how this is achieved through the code 
coauthor <- gsub("<","",sub("^.*?\\s","", author)) 

私は、第1引数がパターンであり、第2引数が置換であり、第3パラメータが操作対象であることをウェブから読み取っています。私はまた、SOのいくつかの投稿を見て、\\wが単語を意味し、\\sがスペースであることを知った。

しかし、いくつかのことはまだ不明です。 \\wは単語を意味し、次の単語を意味しますか?そうでない場合は、どのように解釈すればよいですか?私は^が文字列の先頭と一致することを知りましたが、^の後の期間はどうですか?

さらに重要なことは、_.*の解釈は何ですか.*_について^.*?\\sはどうですか?どうすればそれらを読むべきですか?

ありがとうございます!

+3

ここにあるものhttps://regex101.com – rawr

+0

@rawrどのような味を選ぶべきですか?それらのすべてがエラーを表示するようです。 – Waht

+1

[pcreはうまくいくはずです](https://regex101.com/r/sIb7Ql/1)、私はエラーを表示しません。このウェブサイトを使用しているときには二重\が必要ではありません。 – rawr

答えて

1

かなりの数の質問があります。最初のものが最初に。

sub("_.*","",author)は、それ以降は_です。あなたのケースでは_.*_1 A Kumar; Ahmed Hemani ; Johnny &Ouml;berg<に対応します。関数subを ''で再実行します(実際は削除します)ので、最終的には10になります。

sub(".*_(\\w*)\\s.*", "\\1", author)は(何らかの理由で)よりトリッキーです。それは何も抽出しません。コードをsub(".*_(\\w*)\\s.*", "222", author)に置き換えると、結果は2221ではなく)になります。だから、あなたが2番目の議論に入れたものは、結果として得られます。なぜそう?さて、".*_(\\w*)\\s.*"は文字列全体に対応しているため、.*_10_に対応します。 (\\w*)1に対応し、最後に\\s.*はスペースとその後のすべて(つまり、残りの文字列)を意味します。

gsub("<","",sub("^.*?\\s","", author)) 2つの機能があります。最初の1つはsub("^.*?\\s","", author)です。それは最初から最後まですべてを見ます。したがって、^.*?\\s10_1の略で、削除します。だから、A Kumar; Ahmed Hemani ; Johnny &Ouml;berg<になります。もう1つは「<」を削除します。

私はそれが役に立ちそうです。

+0

'_。*'は '_'の後のすべてを探し、'。* _ 'は' _'の前のすべてを探して操作を行い、 '^。*?'は見えます最初から指定されたもの(私の場合は '\\ s'、スペース)を見つけてそれを操作しますか? – Waht

+0

@what短い答えははいです。 – Vyga