2013-11-03 79 views
0

我一直在嘗試和尋找一種解決方案來匹配python中的每一個其他詞使用正則表達式。該字符串以逗號分隔,長度未知。Python正則表達式匹配所有其他詞

說我有以下字符串:

"keep, ignore, keep_this_too, ignore, keep_this_also, ignore" 

我希望能夠保持所有匹配的單詞的列表。

我試着寫我的正則表達式爲:

((?P<keep>.*),)* 

然後使用

result = re.match(regex, string) 
print result.group(keep) 

在試圖打印出所有匹配的話,而不是我只是得到的一切,但最後一個字。

感謝

編輯:

我不能使用任何Python字符串操作。這樣做的目標是支持研究人員提供的任何數據格式,爲此,我們將正則表達式存儲在每種格式的數據庫中。 例如,他們可以提供一個數據格式,我們必須使用正則表達式如下:

"keep (ignore), keep (ignore), keep (ignore)" 
+0

你的單詞中是否有空格?也就是說,如果你有''一,二,大數據,四,五''? –

+0

@RayToal然後它不會是一個字。 – Bakuriu

+0

謝謝,只是檢查,因爲你說的條款是_comma separated_。但你還能進一步澄清嗎?那麼你是否允許空格分隔單詞呢?或者只是逗號或空格?它有所作爲。 –

回答

2

.*貪婪匹配(匹配一切如果可能的話); .*,匹配一切,直到最後,。要非貪婪地匹配,請使用.*?

re.match只返回第一個匹配。 (並且僅在輸入字符串的開始處匹配)。 (參見search() vs match()

使用re.findall與改性正則表達式:

>>> s = "keep, ignore, keep_this_too, ignore, keep_this_also, ignore" 
>>> re.findall(r'([^,\s]+)', s) 
['keep', 'ignore', 'keep_this_too', 'ignore', 'keep_this_also', 'ignore'] 
>>> re.findall(r'([^,\s]+)', s)[::2] # using slice to get every other matches. 
['keep', 'keep_this_too', 'keep_this_also'] 

或:

>>> re.findall(r'([^,\s]+)(?:,\s*[^,\s]+)?', s) 
['keep', 'keep_this_too', 'keep_this_also'] 
+0

感謝您的響應,但我不想使用任何字符串操作(拼接)。 – dajee

+0

@David,然後使用剛剛使用're.findall'的最後一個代碼。順便說一下'[..:..:..]'叫做片。 – falsetru

+0

我道歉我沒有看到第二部分,我會去試試看。 – dajee

0

的正則表達式定義已經可以在一個字出現什麼字符,即\w表示這樣的集合。 因此:

In [1]: import re 
    ...: re.findall('\w+', "keep, ignore, keep_this_too, ignore, keep_this_also, ignore") 
    ...: 
Out[1]: ['keep', 'ignore', 'keep_this_too', 'ignore', 'keep_this_also', 'ignore'] 

如果你想忽略所有其他比賽簡單地使用切片:

In [2]: ['keep', 'ignore', 'keep_this_too', 'ignore', 'keep_this_also', 'ignore'][::2] 
Out[2]: ['keep', 'keep_this_too', 'keep_this_also'] 

如果你想只保留與keep(或其他子)開頭的字符串,只需使用模式keep\w*,而不是\w+

In [4]: re.findall('keep\w*', "keep, ignore, keep_this_too, ignore, keep_this_also, ignore") 
Out[4]: ['keep', 'keep_this_too', 'keep_this_also'] 

如果你正在嘗試匹配是不是真的一個字,即它可以包含空格,標點符號等字符,那麼您可以在上面的正則表達式中用[^,]替換\w以匹配除逗號之外的所有內容。

1

您仍然可以將.split()存儲在數據庫中嗎?

String="keep, ignore, keep_this_too, ignore, keep_this_also, ignore" 
String.split(",")[0::2] 

輸出:

['keep', ' keep_this_too', ' keep_this_also'] 
0

您可以使用類似:

import re 
re.findall("([^,]*), [^,]+[,]{0,1}", "keep, ignore, keep_this_too, ignore, keep_this_also, ignore") 

但爲什麼不使用分離,切片結果:

"keep, ignore, keep_this_too, ignore, keep_this_also, ignore".split(",")[0::2] 
0

你需要這個:

s = ' keep, ignore, keep_this_too , ignore, keep_this_also, ignore ' 
print(s.replace(' ','').split(',')[0::2]) 

產量:

['keep', 'keep_this_too', 'keep_this_also'] 
0

呢?

>>> s = "keep, ignore, keep_this_too, ignore, keep_this_also, ignore" 
>>> import re 
>>> re.findall(r'(\w+)\W+\w+', s) 
['keep', 'keep_this_too', 'keep_this_also'] 
相關問題