2012-06-03 46 views
0

所以我輸入進來如下:12_34 5_6_8_2 4_____3 1234的Python:正則表達式輸出12_34 - 我需要1234

,我從它需要的輸出是:1234, 5682, 43, 1234

我目前正在r'[0-9]+[0-9_]*'.replace('_','')工作,其中,據我所知,成功拒絕任何不是數字和欠分組合的輸入,其中下劃線不能是第一個字符。

但是,更換_用空字符串會導致12_34出來爲12和34

難道還有比「取代」這個更好的方法?還是我可以修改我的正則表達式來處理這個問題?

編輯:正在回答下面評論中的問題,我意識到它可能更好地指定在這裏。 因此,廣泛的目標是採取長輸入字符串(小例子: 「12_34 +'Iamastring#'I_am_an_Ident」 並返回: ('NUMBER',1234),('PLUS','+'), ('STRING','Iamastring#'),('IDENT','I_am_an_Ident') 我不想經歷所有這些,因爲我已經完全按照規定工作,以外的號碼 解決方案代碼如下所示: t_PLUS =「+」 t_MINUS =' - '''''''' ' 等,下降到: t_NUMBER = ###代碼去這裏 我不知道如何pu牛逼多行處理成t_NUMBER

+1

您的問題中的代碼對我沒有多大意義,但應用此模式可能會解決您的問題:'([0-9] + _ *)+' – Lucero

+1

請注意,編輯問題時,當你評論他們的答案時,人們不會像他們那樣收到通知。 – lvc

+0

+1 Ivc,這就是爲什麼我現在才發現編輯。最好的方法是編輯問題**和** ping你需要查看的人。 –

回答

2

我不知道你的意思,以及爲什麼需要正則表達式,但也許這有助於

In [1]: ins = '12_34 5_6_8_2 4_____3 1234' 

In [2]: for x in ins.split(): print x.replace('_', '') 
1234 
5682 
43 
1234 

編輯迴應編輯的問題:

我還在原地不太清楚你正在使用代幣做什麼,但我會做這樣的事情(至少對我來說很有意義:

input_str = "12_34 + 'Iamastring#' I_am_an_Ident" 
tokens = ('NUMBER', 'SIGN', 'STRING', 'IDENT') 
data = dict(zip(tokens, input_str.split())) 

這將使你

{'IDENT': 'I_am_an_Ident', 
'NUMBER': '12_34', 
'SIGN': '+', 
'STRING': "'Iamastring#'"} 

那麼你可以做

data['NUMBER'] = int(data['NUMBER'].replace('_', '')) 

和其他任何你喜歡的。

P.S.很抱歉,如果它不能幫助,但我真的不明白這一點有tokens = ('PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'IDENT', 'STRING', 'NUMBER')的等

+0

我需要正則表達式,因爲它是一個賦值「使用正則表達式」;我喜歡你的解決方案,我只是不知道如何在定義代幣的代碼塊中實現它,所以: t_PLUS =「\ +」 t_MINUS =' - ' 等等,這似乎是我的眼睛將我限制爲單線解決方案。 –

+0

我不確定我是否理解你對代幣的含義;你的代碼究竟需要做什麼? –

1
a='12_34 5_6_8_2 4___3 1234' 
>>> a.replace('_','').replace(' ',', ') 
'1234, 5682, 43, 1234' 
>>> 
1

你問題的措辭有點不清楚。如果你不關心輸入驗證,下面應該工作:

input = '12_34 5_6_8_2 4_____3 1234' 
re.sub('\s+', ', ', input.replace('_', '')) 

如果你需要真正剔除不屬於任何數字或空白的所有字符,並添加逗號的數字之間,則:

re.sub('\s+', ', ', re.sub('[^\d\s]', '', input)) 

...應該完成任務。當然,編寫一個只需要遍歷字符串一次的函數可能會更有效率,而不是使用多個re.sub()調用。

1

你似乎在做這樣的事情:

>>> data = '12_34 5_6_8_2 4_____3 1234' 
>>> pattern = '[0-9]+[0-9_]*' 
>>> re.findall(pattern, data) 
['12_34', '5_6_8_2', '4_____3', '1234'] 
re.findall(pattern.replace('_', ''), data) 
['12', '34', '5', '6', '8', '2', '4', '3', '1234'] 

問題是pattern.replace是不是一個信號re從比賽中刪除_ S,它改變你的正則表達式到:'[0-9]+[0-9]*'。你想要做的是做replace的結果,而不是模式 - 例如,

>>> [match.replace('_', '') for match in re.findall(pattern, data)] 
['1234', '5682', '43', '1234'] 

另外請注意,您的正則表達式可以稍微簡化;因爲這是作業,所以我將省略細節。

1

好吧,如果你真的使用re只有re,你可能做到這一點:

import re 

def replacement(match): 
    separator_dict = { 
     '_': '', 
     ' ': ',', 
    } 
    for sep, repl in separator_dict.items(): 
     if all((char == sep for char in match.group(2))): 
      return match.group(1) + repl + match.group(3) 

def rec_sub(s): 
    """ 
    Recursive so it works with any number of numbers separated by underscores. 
    """ 
    new_s = re.sub('(\d+)([_ ]+)(\d+)', replacement, s) 
    if new_s == s: 
     return new_s 
    else: 
     return rec_sub(new_s) 

但是,這集中體現了矯枉過正的概念。