2017-08-08 29 views
1

我相信對於比我更有經驗的程序員來說,這將是簡單的選擇,但是這個問題困擾着我,並且我做了一些失敗的嘗試,所以我想看看其他人可能會拿出來。Python中的棘手字符串規範化

我有大約一百個字符串是這個樣子:

(argument1 OR argument2) | inputlookup my_lookup.csv | `macro1(tag,bunit)` | `macro2(category)` | `macro_3(tag,\"expected\",category)` | `macro4(tag,\"timesync\")` 

的目標是找到參數的宏功能,並與自變量的數量取代他們,使最終輸出的外觀像這樣:

(argument1 OR argument2) | inputlookup my_lookup.csv | `macro1(2)` | `macro2(1)` | `macro_3(3)` | `macro4(2)` 

Python有獲得我需要(我只是計數的逗號的數量在串並加入1)計數的方式,和Python有大量的正則表達式類型的解決方案,內嵌的字符串替換,但對於我的生活,我無法弄清楚把它們結合起來。

看起來像re.sub不會讓我識別子字符串,計算子字符串中逗號的數量,然後用該值替換子字符串(除非我在文檔中丟失了某些內容)。

任何人都可以想辦法做到這一點?我錯過了明顯的東西嗎?

回答

0

解決方案:

import re 

def count_commas(input_str): 
    c = 0 
    for s in input_str: 
     if s == ',': 
      c += 1 
    return c 

pattern = r'\([A-Za-z0-9,""]+\)' 
original_str = '(argument1 OR argument2) | inputlookup my_lookup.csv | `macro1(tag,bunit)` | `macro2(category)` | `macro_3(tag,\"expected\",category)` | `macro4(tag,\"timesync\")`' 

matches = re.findall(pattern, original_str) 

for match in matches: 
    comma_count = count_commas(match) + 1 
    match = match.replace('(', '\(').replace(')', '\)') 
    original_str = re.sub(r'' + match, '(' + str(comma_count) + ')', original_str) 

print (original_str) 

說明:

pattern: 「\([A-ZA-Z0-9」, 「] + \)」 - 反斜槓逃脫特殊字符'('和')'在正則表達式,然後我正在尋找字母數字,逗號和引號(在方括號中),後面跟着'+',這意味着在這個正方形中一個或多個這樣的符號重複括號。
matches:找到的所有匹配的列表。例如 - (tag,bunit)

然後,我遍歷所有匹配,找到匹配中逗號的數目,然後用'\'替換'(','('和')',以便在正則表達式中逃脫。
最後,在循環的最後一行中,我使用re.sub用原始字符串中的逗號計數替換匹配的字符串。

+0

工程就像一個魅力!感謝回覆。 – Aquahner