python
  • regex
  • python-2.7
  • 2015-10-05 66 views -1 likes 
    -1

    我的表現能夠爲一個occurence做,但如果多次出現被賦予它捕獲整體的一部分。如何找到一個正則表達式的匹配

    我的正則表達式是

    [=:]\s*[\"\']?(.*=_ash)[\"\']? 
    

    我試圖與這兩個regex.findallsearch 我得到了整個零件時,多次出現在那裏。

    我是否需要設置任何標誌搜索多次出現的是有我的正則表達式本身就是一個問題。

    前三行的工作,但

    sample_string = 'asdfanksdfkjasdf_ash' 
    
    sample_str = "asdfasdfasdf_ash" 
    
    sample_st = assdfvb/23+sdf_ash 
    
    sample_s : 'assdfvb/23+sdf_ash' 
    
    sample = {'sample' : { 'hi' : 'asdfasdf+/asdf+_ash' , 'hello' : 'asdfasf+/asdf+v_ash' }} 
    

    我只需要在這裏值部分

    +0

    請在你的問題更加清晰。寫什麼是輸入什麼是輸出和什麼是您的預期輸出。 –

    +0

    @nhahtdh這不僅僅是爲了json,正如我的例子清楚地告訴它的那樣。 –

    +0

    @Noname:讓我澄清一下我的陳述:如果您有某種方法將JSON與其他輸入區分開來,則應該使用JSON解析器來處理它們。 – nhahtdh

    回答

    0

    我想你需要你的正則表達式更改爲:

    [=:]\s*['"]?([^\s\'\"=:]*?_ash)['"]? 
    

    [Regex Demo]

    1

    您的模式的問題是.*

    默認情況下,正則表達式引擎是貪婪的,.*消耗的多,因爲它可以。要改變這種行爲,你可以使用lazy quantifier。在.*?中增加額外的「」使其重複儘可能少。

    此外,您可能希望把它的情況下失敗,其中一個值不"_ash"結束,檢查中引用的文字,或空間的報價,如果它沒有報價:

    正則表達式:

    [=:]\s*(?:(["'])((?:(?!\1).)*_ash)\1|(\S*_ash)(?!\S)) 
    

    regex101 Demo

    • (["'])上尉URES在組報價1
    • (?:(?!\1).)*任何字符匹配除了報價捕捉在第1組
    • \1關閉的引號與沒有引用的文本
    • \S*(用作打開引用相同),匹配除了空間
    • 任何匹配
    • (?!\S)檢查值結束還有

    值在.group(2)捕捉如果他們在引號,或.group(3)如果未加引號。

    代碼:

    #python 2.7.10 
    import re 
    
    text = """sample = {'sample' : { 'hi' : 'asdfasdf+/asdf+_ash' , 'hello' : 'asdfasf+/asdf+v_ash' }}""" 
    n = 0 
    
    pattern = re.compile(r'[=:]\s*(?:(["\'])((?:(?!\1).)*_ash)\1|(\S*_ash))') 
    
    #loop all matches 
    for match in pattern.finditer(text): 
        n += 1 
        print '\nMatch #%s:' % n 
    
        #Show groups 2 and 3 captures 
        for i in range(2,4): 
         print 'Group %s - [%s:%s]: %s' % (i, match.start(i), match.end(i), match.group(i)) 
    

    ideone Demo

    相關問題