問題:
我需要從文本塊中提取$
個字符之間的字符串,但對於正則表達式,我總共是n00b。
例如從這樣的文字:
Li Europan lingues $es membres$ del sam familie. Lor $separat existentie es un$ myth.
我想獲得由以下組成的數組:
{'es membres', 'separat existentie es un'}
Python中的小片段將是巨大的。
問題:
我需要從文本塊中提取$
個字符之間的字符串,但對於正則表達式,我總共是n00b。
例如從這樣的文字:
Li Europan lingues $es membres$ del sam familie. Lor $separat existentie es un$ myth.
我想獲得由以下組成的數組:
{'es membres', 'separat existentie es un'}
Python中的小片段將是巨大的。
導入re
模塊,並使用findall()
:
>>> import re
>>> p = re.compile('\$(.*?)\$')
>>> s = "apple $banana$ coconut $delicious ethereal$ funkytown"
>>> p.findall(s)
['banana', 'delicious ethereal']
圖案p
表示美元符號(\$
)的,則非貪婪匹配組((...?)
)相匹配的字符(.
)其中必須有零個或多個(*
),後面跟着另一個美元符號(\$
)。
正則表達式如下捕捉$字符非貪婪
\ $之間的一切\ $
可以re.findall使用(*):
>>> re.findall(r'\$(.*?)\$', s)
['es membres', 'separat existentie es un']
import re;
m = re.findall('\$([^$]*)\$','Li Europan lingues $es membres$ del sam familie. Lor $separat existentie es un$ myth');
您不需要在字符類內跳過'$'。 – Gumbo 2009-12-30 23:57:15
雖然OP沒有說他的輸入可能包含空對美元符號(之間沒有字符),但是使用「+」而不是「*」意味着如果確實發生了這種情況,那麼它將不同步。更重要的是,如果沒有一個羣體(使用偏食),產量包括美元符號。 – 2010-01-01 15:58:52
是的。你們倆都是對的。編輯。 – 2010-01-01 21:23:51
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 - 全球
這個問題被標記爲「Python」,並在答案中包含了對Python代碼片段的顯式請求。 – 2009-12-31 00:28:00
嗯,這是一個「非常好」的請求類型。我不認爲python片段的缺乏證明downvote是正當的。當然,我也不會贊成它。 – 2010-01-01 22:50:41
替代無正則表達式,其適用於這個簡單的例子:
>>> 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列表),然後僅使用此列表的每個「第二個」元素。
-1它不工作。你是否將你的答案與OP預期的相比?提示:再次嘗試使用[1 :: 2]而不是[:: 2] – 2009-12-31 01:52:15
True(必須輸入/回答太快)。據此編輯。 – ChristopheD 2009-12-31 07:09:02
@邁克爾,有人可能會認爲像這樣的答案值得鏈接到文檔(我這樣做),但它是簡潔和正確的,所以它肯定不應該因缺乏而受到低估。我會用贊成的方式來抵消它。 – 2010-01-01 15:55:37