2013-08-21 75 views
1

我有一些字符串看起來像這樣的Python的字符串中的

S25m\S25m_16Q_-2dB.png 
S25m\S25m_1_16Q_0dB.png 
S25m\S25m_2_16Q_2dB.png 

我想斜線和最後一個下劃線,也是最後一個下劃線和延伸之間的串之間的串重新比賽最後的底線,所以

期望:

[S25m_16Q, S25m_1_16Q, S25m_2_16Q] 
[-2dB, 0dB, 2dB] 

我能夠做

拿到斜線和擴展之間的整個事情
foo = "S25m\S25m_16Q_-2dB.png" 
match = re.search(r'([a-zA-Z0-9_-]*)\.(\w+)', foo) 
match.group(1) 

但我不知道如何製作一個模式,所以我可以用最後一個下劃線來分割它。

回答

5

捕獲你想要得到的組。

>>> re.search(r'([-\w]*)_([-\w]+)\.\w+', "S25m\S25m_16Q_-2dB.png").groups() 
('S25m_16Q', '-2dB') 
>>> re.search(r'([-\w]*)_([-\w]+)\.\w+', "S25m\S25m_1_16Q_0dB.png").groups() 
('S25m_1_16Q', '0dB') 
>>> re.search(r'([-\w]*)_([-\w]+)\.\w+', "S25m\S25m_2_16Q_2dB.png").groups() 
('S25m_2_16Q', '2dB') 

*匹配前一字符集貪婪(消耗盡可能多的);它繼續到最後_,因爲\w包括字母,數字和下劃線。


>>> zip(*[m.groups() for m in re.finditer(r'([-\w]*)_([-\w]+)\.\w+', r''' 
... S25m\S25m_16Q_-2dB.png 
... S25m\S25m_1_16Q_0dB.png 
... S25m\S25m_2_16Q_2dB.png 
... ''')]) 
[('S25m_16Q', 'S25m_1_16Q', 'S25m_2_16Q'), ('-2dB', '0dB', '2dB')] 
+0

謝謝!模式如何區分不同的下劃線? 「最後的下劃線」部分在哪裏? – LWZ

+0

@LWZ,'*'貪婪地匹配。它消耗盡可能多。 – falsetru

+0

我明白了。現在我可以理解這一個。我想我一般都不會很清楚。 – LWZ

0

非正則表達式的解決方案(雖然比較亂):

>>> import os 
>>> s = "S25m\S25m_16Q_-2dB.png" 
>>> first, _, last = s.partition("\\")[2].rpartition('_') 
>>> print (first, os.path.splitext(last)[0]) 
('S25m_16Q', '-2dB') 
-3

我知道它說用re,但爲什麼不使用split

strings = """S25m\S25m_16Q_-2dB.png 
S25m\S25m_1_16Q_0dB.png 
S25m\S25m_2_16Q_2dB.png""" 

strings = strings.split("\n") 

parts = [] 
for string in strings: 
    string = string.split(".png")[0] #Get rid of file extension 
    string = string.split("\\") 
    splitString = string[1].split("_") 
    firstPart = "_".join(splitString[:-1]) # string between slash and last underscore 
    parts.append([firstPart, splitString[-1]]) 


for line in parts: 
    print line 
['S25m_16Q', '-2dB'] 
['S25m_1_16Q', '0dB'] 
['S25m_2_16Q', '2dB'] 

然後,只需調換陣列,

for line in zip(*parts): 
    print line 
('S25m_16Q', 'S25m_1_16Q', 'S25m_2_16Q') 
('-2dB', '0dB', '2dB') 
+0

感謝downvotes,同時編輯一個問題,我意外地提交之前,它已經完成了傢伙! – will