2013-03-06 78 views
1

我正在幫助某人在工作時使用支持python正則表達式語法的應用程序進行重命名。我嘗試了一些表達式,如^[^_]+(?=_)在下面的a)中找到了一些表達式,但它沒有正常工作,還有一些沒有工作。所以,我想我應該聯繫一個真正瞭解他們在做什麼的人。謝謝你的幫助。下劃線周圍的三個python正則表達式

一)中第一個表達式我一定要找到第一個下劃線之前的所有字符的模式是這樣的:

cannon_mac_23567_prsln_333 
jones_james_343342_prsln_333 
smith_john_223462_prsln_333 

所以,我必須讓大炮,瓊斯和史密斯

B)在另一個表達式中,我必須找到第一個和第二個下劃線之間的所有字符。所以,我需要在上面的例子中找到mac,james和john。

C)中最後一個表達式我一定要找到第一個下劃線

重命名的應用程序的工作我有三個部分做這些正則表達式,像上面的方式。謝謝。

+0

你應該告訴你已經嘗試過什麼每個部分的元組。你的嘗試沒有成功? – askewchan 2013-03-06 20:59:59

+0

更新了我的答案,應該做你想要的。 – msvalkon 2013-03-06 22:02:27

回答

1

我會使用:

1. ^([^_]+)_ 
2. _([^_]+)_ 
3. ^[^_]_ 

使用re.match,因爲它在字符串的開頭相匹配。

[編輯:邪神指出的那樣,你可能不使用這個正則表達式的更好,因爲它的速度更快和更容易使用字符串方法]

+0

,這是完美的。謝謝!我在請求中犯了一個錯誤。對於第2步,你可以包含尾部下劃線嗎?例如,它會找到「james_」而不是「james」 – user2141579 2013-03-06 22:26:02

+0

爲此,您需要將下劃線_inside_放在括號內,而不是放在外面。 – Mariano 2013-03-06 23:16:31

3

那麼,你可以完全沒有正則表達式,因爲你知道你的分隔符是下劃線。

使用str.splitindex方法。

'smith_john_223462_prsln_333'.split('_')[0] //(to extract smith) 
'smith_john_223462_prsln_333'.split('_')[1] //(to extract john) 
'smith_john_223462_prsln_333'.index('_') //(to get position of first underscore) 
+0

謝謝,但必須是正則表達式。我正在使用桌面應用程序進行文件重命名,它支持python正則表達式語法。實際上並沒有使用python – user2141579 2013-03-06 21:16:55

1

好吧,我誤解你的問題在第一。雖然str.split絕對是解決這個問題的更優雅的方法,但下面是三個正則表達式,以滿足您的需求。我不知道你的這個應用程序是否會與他們合作。所以拿一點鹽來吧。

請查看re圖書館和MatchObject.span()瞭解更多信息。

作爲一個單一的正則表達式:

import re 
line = "cannon_mac_23567_prsln_333" 
In [1812]: match = re.match(r"(.+?)(\_)(.+?)\_", line) 

In [1813]: match.groups() 
Out[1813]: ('cannon', '_', 'mac') 

In [1814]: match.span(2)[0] <-- second group, start. The first occurence of _ 
Out[1814]: 6 

In [1815]: line[6] 
Out[1815]: '_' 

Seprated在A,B,C:

一個:

import re 
line = "cannon_mac_23567_prsln_333" 
In [1707]: match = re.match(r"(.+?)\_", line) 

In [1708]: match.groups() 
Out[1708]: ('cannon',) 

B:

In [1712]: match = re.match(r".+\_(.+?)\_", line) 

In [1713]: match.groups() 
Out[1713]: ('prsln',) 

C:最後一個使用re.search來簡化。MatchObject.span()回報的位置(start, end)

In [1763]: match = re.search("\_", line) 

In [1764]: match.span()[0] 
Out[1764]: 6 

In [1765]: line[6] 
Out[1765]: '_' 
相關問題