2

私は、コンゴ共和国とコンゴ民主共和国を参照する文字列を区別するのにかなりスマートな perl 互換の正規表現を書くのに苦労しています。正規表現が文字列と一致する場合は True を返し、それ以外の場合は False を返すR's関数のプログラムでこの式を使用します。grep

私が特定したい国は、異なる順序/方法で書かれることがあります。例えば:

コンゴ共和国

コンゴ共和国

コンゴ共和国

コンゴ共和国

一致させたくない国にも同様のパターンがあります。

democratic republic of the congo

congo, democratic republic of the

dem rep of the congo

私が探しているのは、担当者とコンゴで一致する正規表現ですが、文字列に「dem」があるといつでも失敗します。

何か案は?ありがとう!

4

4 に答える 4

3
> countries <- scan(what="character")
1:     'republic of congo'
2:     'republic of the congo'
3:     'congo, republic of the'
4:     'congo, republic'
5: 'democratic republic of the congo'
6: 'congo, democratic republic of the'
7: 'dem rep of the congo'
8: 
Read 7 items
> grep("dem", countries, ignore.case=TRUE,value=TRUE, invert=TRUE)
[1] "republic of congo"      "republic of the congo"  "congo, republic of the" "congo, republic"     
于 2012-06-01T17:20:20.930 に答える
2

私はRを知りませんが、この正規表現はあなたが説明したものと正確に一致します. と に一致する正規表現ですが、文字列にrepcongodem

/^(?=.*rep)(?=.*congo)(?!.*dem)/i;

また、必要に応じてサンプル文字列をフィルタリングします。

于 2012-06-01T17:25:23.437 に答える
1

これは最初のサンプル文字列に一致し、2 番目のサンプル文字列を無視します

^(.(?<!dem))*congo(.(?<!dem))*$

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

if ($subject =~ m/^(.(?<!dem))*congo(.(?<!dem))*$/m) {
    # Successful match
} else {
    # Match attempt failed
}
于 2012-06-01T17:20:07.200 に答える
0

それはpythonで私のために働きます:

pattern = (?!democratic\s+)(?:republic)\s+of\s+(?:the\s+)?congo|congo,\s+republic(?:\s+of\s+the)?

// A String holding positive and negative examples mixed
string = 'republic of congo, republic of the congo, congo, republic of the, congo, republic, democratic republic of the congo, congo, democratic republic of the, dem rep of the congo'

re.findall(pattern, string) // return ['republic of congo', 'congo, republic of the', 'congo, republic', 'republic of the congo']
于 2012-06-01T17:34:23.880 に答える