2009-12-30 52 views
2

問題:
我需要從文本塊中提取$個字符之間的字符串,但對於正則表達式,我總共是n00b。

例如從這樣的文字:
Li Europan lingues $es membres$ del sam familie. Lor $separat existentie es un$ myth.

我想獲得由以下組成的數組:
{'es membres', 'separat existentie es un'}

Python中的小片段將是巨大的。

回答

5

導入re模塊,並使用findall()

>>> import re 
>>> p = re.compile('\$(.*?)\$') 
>>> s = "apple $banana$ coconut $delicious ethereal$ funkytown" 
>>> p.findall(s) 
['banana', 'delicious ethereal'] 

圖案p表示美元符號(\$)的,則非貪婪匹配組((...?))相匹配的字符(.)其中必須有零個或多個(*),後面跟着另一個美元符號(\$)。

1

正則表達式如下捕捉$字符非貪婪

\ $之間的一切\ $

3

可以re.findall使用(*):

>>> re.findall(r'\$(.*?)\$', s) 
['es membres', 'separat existentie es un'] 
+0

@邁克爾,有人可能會認爲像這樣的答案值得鏈接到文檔(我這樣做),但它是簡潔和正確的,所以它肯定不應該因缺乏而受到低估。我會用贊成的方式來抵消它。 – 2010-01-01 15:55:37

1
import re; 
m = re.findall('\$([^$]*)\$','Li Europan lingues $es membres$ del sam familie. Lor $separat existentie es un$ myth'); 
+0

您不需要在字符類內跳過'$'。 – Gumbo 2009-12-30 23:57:15

+0

雖然OP沒有說他的輸入可能包含空對美元符號(之間沒有字符),但是使用「+」而不是「*」意味着如果確實發生了這種情況,那麼它將不同步。更重要的是,如果沒有一個羣體(使用偏食),產量包括美元符號。 – 2010-01-01 15:58:52

+0

是的。你們倆都是對的。編輯。 – 2010-01-01 21:23:51

-1

Perl中有效的正則表達式演示:

my $a = 'Li Europan lingues $es membres$ del sam familie. Lor $separat existentie es un$ myth.'; 
my @res; 
while ($a =~ /\$([^\$]+)\$/gos) 
{ 
push(@res, $1); 
} 

foreach my $item (@res) 
{ 
print "item: $item\n"; 
} 

fl AGS:S - 把所有的輸入文本爲單行,G - 全球

+4

這個問題被標記爲「Python」,並在答案中包含了對Python代碼片段的顯式請求。 – 2009-12-31 00:28:00

+0

嗯,這是一個「非常好」的請求類型。我不認爲python片段的缺乏證明downvote是正當的。當然,我也不會贊成它。 – 2010-01-01 22:50:41

0

替代無正則表達式,其適用於這個簡單的例子:

>>> s="Li Europan lingues $es membres$ del sam familie. Lor $separat existentie es un$" 
>>> s.split("$")[1::2] 
['es membres', 'separat existentie es un'] 

就劈在「$」字符串(這給你一個Python列表),然後僅使用此列表的每個「第二個」元素。

+0

-1它不工作。你是否將你的答案與OP預期的相比?提示:再次嘗試使用[1 :: 2]而不是[:: 2] – 2009-12-31 01:52:15

+0

True(必須輸入/回答太快)。據此編輯。 – ChristopheD 2009-12-31 07:09:02

相關問題