2

我正在努力编写一个与 perl 兼容的正则表达式,该表达式在区分指刚果共和国和刚果民主共和国的字符串方面相当聪明。我将在R'grep函数的程序中使用这个表达式,如果正则表达式匹配字符串,则返回 True,否则返回 False。

我有兴趣识别的国家有时可以用不同的顺序/方式书写。例如:

刚果共和国

刚果共和国

刚果共和国

刚果共和国

我不想匹配的国家有类似的模式:

democratic republic of the congo

congo, democratic republic of the

dem rep of the congo

我想,我正在寻找的是一个匹配 rep 和 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,但是这个正则表达式将与您描述的完全匹配,一个正则表达式将匹配repand ,但只要字符串中congo有 a 就会失败dem

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

它还可以根据需要过滤您的示例字符串。

于 2012-06-01T17:25:23.437 回答
1

这与您的第一个示例字符串匹配并忽略第二个

^(.(?<!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 回答