3

この質問に適切なタイトルを付けるのは難しいと思いました。そのため、誤解を招く可能性がある場合は、改善にご協力いただければ幸いです。

xml ファイルの属性の値を抽出し、以下の例の行に記載されているように出力しました。

category:buffer overflow  analyzer:data flow analyzer:buffer

これを次のように分割する必要があります

category:buffer overflow
analyzer:data flow
analyzer:buffer

Java、Perl、または Python を使用してこれを行う方法がわかりません。

これまでのところ、これを ":" で分割する単純な Perl スクリプトしかありません。

すべての提案が役に立ちます。

4

4 に答える 4

5

適切な正規表現が機能します。Python のreモジュールを使用した実装は次のとおりです。

import re

s = 'category:buffer overflow  analyzer:data flow analyzer:buffer'

print(re.findall(r"(\w+:[\w ]+)(?: |$)", s))
#prints ['category:buffer overflow ', 'analyzer:data flow', 'analyzer:buffer']
于 2013-03-18T09:47:50.407 に答える
3

このsedワンライナーはここで機能します:

sed -r 's/ ([^ ]+:)/\n\1/g' input

テスト:

kent$  echo "category:buffer overflow  analyzer:data flow analyzer:buffer" |sed -r 's/ ([^ ]+:)/\n\1/g'                                                                     
category:buffer overflow 
analyzer:data flow
analyzer:buffer

このJava行はここでも機能します:

System.out.println("category:buffer overflow  analyzer:data flow analyzer:buffer".replaceAll("\\s([^\\s]+:)", "\n$1"));

さらに別のPython行:

In [1]: import re

In [2]: s = 'category:buffer overflow  analyzer:data flow analyzer:buffer'                                                                                                 

In [3]: print re.sub(r"\s(?=[^\s]*:)",'\n',s)
category:buffer overflow 
analyzer:data flow
analyzer:buffer
于 2013-03-18T09:55:33.043 に答える
1

Java では、これは次のようになります。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Extractor {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Pattern pattern = Pattern
                .compile("(\\w+:[\\w ]+)(?: |$)");
        Matcher matcher = pattern
                .matcher("category:buffer overflow  analyzer:data flow analyzer:buffer");
        while (matcher.find()) {
            System.out.println(matcher.group());
        }
    }

}
于 2013-03-18T09:59:12.743 に答える
1

パールでは:

$s = "category:buffer overflow  analyzer:data flow analyzer:buffer";
$s .= " "; 
@keyz = split(/:[A-Za-z\d\s]*\s/, $s);
print "@keyz\n";
@params = split(/[A-Za-z\d]*:/, $s);
print "@params\n";

配列 @keyz = ("category", "analyzer", "analyzer") および配列 @params=("buffer overflow", "data flow", "buffer") を生成します

于 2013-03-18T10:48:34.057 に答える