python
  • regex
  • string
  • python-2.7
  • regex-negation
  • 2017-10-09 86 views 1 likes 
    1

    我試圖從字符串中提取令牌,以使這些令牌滿足特定的條件。在我的具體情況,我想提取符號,如+,=, - ,等Python正則表達式匹配不在引號之間的某些字符

    我已經創建了下面的正則表達式:

    ​​

    然而,當我申請:

    reg.findall('x += "hello + world"') 
    

    它還匹配引號之間的+,所以它輸出:

    ['+', '=', '+'] 
    

    我的預期成果是:

    ['+', '='] 
    

    我的問題是,我該如何做到這一點?它甚至有可能嗎?我一直在網上衝浪,但只發現如何匹配除雙引號外的所有內容,以及類似的內容。

    +0

    這是不可能一次完成的。您需要首先消除所有引用段(並正確處理任何嵌套引號)。但是這個的目的是什麼?它看起來像你試圖解析源代碼,或者也許是算術語句。 – ekhumoro

    +0

    事實上,我正在嘗試對源代碼進行詞法分析,所以我只想在這種情況下我定義的符號類型符號的標記。問題是,當定義一個字符串時,我不知道如何處理它。我的猜測是與團體一起玩,但我不知道它是否是正確的路徑... – dpalma

    +0

    源代碼是什麼語言?如果是python,請使用[tokenize](https://docs.python.org/2/library/tokenize.html#module-tokenize)。 – ekhumoro

    回答

    1

    首先,你不需要逃避角色等級中的每個特殊字符(不考慮[])。所以你最初的表情就變成了......像:

    [-\[\]{}().,;+*/&|<>=~] 
    

    現在到第二個要求:匹配某些職位(並保留一些原樣)。在這裏,你既可以使用較新的regex模塊和寫(demo on regex101.com):

    "[^"]+"(*SKIP)(*FAIL)|[-\[\]{}().,;+*/&|<>=~] 
    


    或者使用括號與老 re模塊和一些編程邏輯:

    import re 
    
    rx = re.compile(r'"[^"]+"|([-\[\]{}().,;+*/&|<>=~])') 
    
    string = 'x += "hello + world"' 
    
    symbols = [match.group(1) for match in rx.finditer(string) if match.group(1)] 
    print(symbols) 
    


    雙方將產生

    ['+', '='] 
    


    種 這些方法遵循機制:

    match_this_but_dont_save_it | (keep_this) 
    

    你可能想了解更多關於(*SKIP)(*FAIL)here

    0

    我覺得你可以做一件事,你可以限制,一旦

    會來它不會檢查正則表達式,直到

    另一次出現」

    來吧

    相關問題