2017-10-07 47 views
0

鑑於以下字符串Python的正則表達式排除某些前綴

s = '"foo" "bar2baz_foo" foo(bar2baz_foo(p_foo p_foo.' 

我需要一個正則表達式,從而

re.findall(regex, s) 

['foo', 'bar2baz_foo', 'foo', 'bar2baz_foo'] 

所以它匹配的第一個四 「字」 不包括引號和括號,但不是最後兩個。 我嘗試了幾個不同的東西,但沒有什麼我可以拿出實際的作品。

希望有人在這裏可以提供幫助。

編輯:我應該補充一點,我想用別的東西替換結果,而不僅僅是找到它,即我想使用re.sub而不是re.findall。字符串也是現實中文本文件的內容,因此時間更長。我只是提取相關的位。

+0

您應該包括正則表達式/你已經在你的問題描述嘗試,以及相關的代碼。 –

+0

'前四'或'不是sartswith p_'? – Silencer

+0

我我的情況是相同的,但我認爲'不startswith p_'是因爲更普遍較好。我會添加我嘗試過的表達式,但他們甚至沒有接近我想要的。 – Lxndr

回答

0

如果你不拼命純粹的正則表達式的解決方案,你可以使用The Greatest Regex Trick Ever

>>> s = '"foo" "bar2baz_foo" foo(bar2baz_foo(p_foo p_foo.' 
>>> import re 
>>> filter(None, re.findall(r'p_\w*|(\w+)', s)) 
['foo', 'bar2baz_foo', 'foo', 'bar2baz_foo'] 

小演示了使用在re.sub

>>> re.sub(r'p_\w*|(\w+)', lambda m: 'WORD' if m.group(1) else m.group(), s) 
'"WORD" "WORD" WORD(WORD(p_foo p_foo.' 
+0

這實際上工作,但因爲我試圖取代別的東西的話,也將導致代碼而不是彼此15行左右。所以我想等一下,看看別人能不能提出一個純粹的正則表達式解決方案。 – Lxndr

+0

@Lxndr看一看我只是說了're.sub'例子。 –

+0

我會後一個問題,但我只能張貼問題,每90分鐘一次,所以我將不得不等待另外60分鐘。問題是,真正的字符串實際上是C++代碼文件的內容。所以我將不得不通過文件循環來使用'filter'的結果。 – Lxndr