2014-05-14 21 views
3

我有一個字符串,它看起來像這樣Python的正則表達式援助

24 (prem)-42-48 (6 ext)

,我想擺脫它是什麼

['24 prem', '42', '48', '6 ext']

我能得到的數字是這樣的:

import re 
MyString = r'24 (prem)-42-48 (6 ext)' 
Splits = re.findall(r'(\d+)', MyString) # ['24','42','48','6'] 

但我失去了成功丁文。

我也可以這樣做:

import re 
MyString = r'24 (prem)-42-48 (6 ext)' 
Splits = re.findall(r'[\\s:\\-]', MyString) # ['24 (prem)','42', '48 (6 ext)'] 

但忽略了(6 ext)項目。看到響應後

編輯:

我想也許我來處理這將是分裂的數字,然後只用str.replace擺脫的「(」和「」字最簡單的方法。

那麼,有沒有一個簡單的正則表達式語句數的第一個字符之前分割字符串?

結果從

'24 (prem)-42-48 (6 ext)'

演藝吧

['24 (prem)-','42-',48 (', '6 ext)]

+1

所以,*模式是什麼*?你給了我們一個輸入+期望的輸出行,但沒有提到輸入怎麼變化*。 –

+1

你的最後一個模式也是無效的;該代碼行生成'[' - ',' - ']'並且可以找到所有反斜槓,冒號,破壞字符's''。 –

+2

最後但並非最不重要的一點是,您的示例輸出是a)不是Python,b)僅使用正則表達式不可能; '['24','prem','42','48','6 ext']'是可行的,但不是'24 prem'作爲第一個元素。 –

回答

2

得到這一結果,你不需要正則表達式,所有你需要做的就是用空格替換它們刪除不需要的字符和分裂的空間字符串:

>>> s ="24 (prem)-42-48 (6 ext)" 
>>> l = s.replace('(',' ').replace('-',' ').replace('(',' ').replace(')',' ').split() 
>>> l 
['24', 'prem', '42', '48', '6', 'ext'] 

這裏是一個使用翻譯的python3版本:

>>> s.translate(s.maketrans("()-", " ")).split() 
['24', 'prem', '42', '48', '6', 'ext'] 

這裏有一個versio N使用正則表達式:

>>> list(filter(lambda x: x is not '', re.findall('[^-() ]*', s))) 
['24', 'prem', '42', '48', '6', 'ext'] 

不過,我考慮的是,在結果列表中'24 prem''6 ext'是你犯了一個錯字,否則就沒有通用的方法做你想要什麼,但你可以通過執行實現這一目標:

>>> [" ".join(l[:2])] + l[2:-2] + [" ".join(l[-2:])] 
['24 prem', '42', '48', '6 ext'] 
+0

也值得添加正則表達式解決方案。看起來他只是在尋找're.findall([^ - ()] *)'。我正在考慮回答,但我認爲我沒有什麼重要的使用str.translate(表[,deletechars])添加 –

+3

是刪除多字符的更好方法。 python docs的示例是>>>'閱讀這個短文本'.translate(None,'aeiou') 'rd ths shrt txt' - 我知道格式被搞砸了,但你明白了我希望的一點。 –

+1

@GaryWalker是Python2中的'string.translate'和Python3中的'str.translate',但是Python3不允許使用可選的'deletechars'參數。 'str.translate(str.maketrans(「」,「」,「() - 」))'在Python3 –

0

我不得不把你的字符串格式一些猜測,但在這裏是一個匹配正則表達式。請注意,您爲分組匹配「(」用字符「(」和使用(...)

regex = re.compile(r'(\d+) \(([a-zA-Z]+)\)-(\d+)-(\d+) \((\d+) ([a-zA-Z]+)\)') 

您可以找到有關文本的更大的塊線或多個匹配一根火柴。

>>> regex=r'(\d+) \(([a-zA-Z]+)\)-(\d+)-(\d+) \((\d+) ([a-zA-Z]+)\)' 
>>> re.findall(regex,lines) 
[('24', 'prem', '42', '48', '6', 'ext'), ('25', 'prex', '43', '48', '7', 'ext')] 
>>> regex= re.compile(r'(\d+) \(([a-zA-Z]+)\)-(\d+)-(\d+) \((\d+) ([a-zA-Z]+)\)') 
>>> line='24 (prem)-42-48 (6 ext)' 
>>> regex.match(line).groups() 
('24', 'prem', '42', '48', '6', 'ext') 
>>> lines="""24 (prem)-42-48 (6 ext) 
... 25 (prex)-43-48 (7 ext) 
... """ 
>>> regex.findall(lines) 
[('24', 'prem', '42', '48', '6', 'ext'), ('25', 'prex', '43', '48', '7', 'ext')] 
>>> 
+0

這個工程很好,基於我給你的輸入,但事實證明,它不能用於從我沒有發佈的其他輸入中提取數據。抱歉提供不完整的問題陳述。 – nickvans

+0

@nickvans - 沒問題。這只是一個起點。 – tdelaney