2017-05-02 82 views
2

我試圖建立一個正則表達式,它可以讓我檢查一些單詞是不是由其他一些單詞前面。正則表達式來檢查是否有其他一些字不在其他

我使用負面lookbehind,但問題是,之間可能有其他詞。這裏是我的測試字符串:

very pure bright and nice 

我想匹配不錯,但只有當他們沒有通過非常前面。這是我迄今爲止所嘗試的:

(?<!very (?=(.{1,20})?(bright)(?=(.{1,20})?(nice))))(nice|bright) 

但是,這總是匹配最後一個單詞。 是否有可能或者我應該考慮嘗試以編程方式進行操作?

+0

這個詞不應該用「非常」在同前句子還是全文? –

+0

在同一句話中,我期望小塊的文字塊:從一到三句。 – grundic

回答

0

我工作的解決方案是創建兩個正則表達式:正面和負面。隨着積極的,我只查這句話包含所需的詞和負我檢查一些特定的單詞後面跟着他們,然後否定消極的搜索結果:

# /usr/bin/python 

import re 

RE_PATTERN = re.compile(r'(bright|nice)') 
RE_NEGATIVE_PATTERN = re.compile(r'very(?=.{1,30}(?:bright|nice))') 


def match(string): 
    pos_match = RE_PATTERN.search(string) 
    neg_match = RE_NEGATIVE_PATTERN.search(string) 
    matches = (bool(pos_match), not neg_match) 
    return all(matches) 


def test_matched(): 
    for s in [ 
     'bright', 
     'nice', 
     'something bright', 
     'something nice', 
     'bright and nice', 
     'nice and bright', 
    ]: 
     assert match(s), s 


def test_not_matched(): 
    for s in [ 
     'very pure bright and nice', 
     'very good', 
     'very bright', 
     'very nice', 
     'very something nice and bright', 
     'very something nice', 
     'very something bright', 
    ]: 
     assert not match(s), s 


def main(): 
    test_matched() 
    test_not_matched() 


if __name__ == '__main__': 
    main() 
0

這是怎麼回事?

"\w*(?<!very)(nice|bright)" 
+0

這太容易了:) https://regex101.com/r/c68Moa/1這裏最難的部分是在lookbehind和匹配組之間有一些東西。 – grundic

相關問題