2013-03-31 66 views
0

我遇到麻煩匹配字符串與正則表達式(我沒有經驗與正則表達式)。我有一個字符串,其中包含每個單詞和標籤後面的正斜槓。舉個例子:正則表達式單詞中的單詞與全阻

led/O by/O Timothy/PERSON R./PERSON Geithner/PERSON ,/O the/O president/O of/O the/O New/ORGANIZATION

在這些字符串,我只是在這之前/PERSON所有字符串感興趣。下面是我想出了正則表達式模式:

(\w)*\/PERSON

而且我的代碼:

match = re.findall(r'(\w)*\/PERSON', string) 

基本上,我匹配/PERSON之前出現的單詞。輸出:

>>> reg 
['Timothy', '', 'Geithner'] 

我的問題是,第二場比賽,匹配到一個空字符串作爲R./PERSON,點不是單詞字符。我改變了我的正則表達式來:

match = re.findall(r'(\w|.*?)\/PERSON', string) 

但比賽現在是:

['led/O by/O Timothy', ' R.', ' Geithner']

這是第一個/人,其中包括led/O by/O,而不是隻匹配Timothy之前採取一切。有人可以幫助我如何做這個匹配,而包括一個完整的中止作爲一個縮寫?或者至少,沒有一個空字符串匹配?

感謝,

回答

1

比賽的一切,但一個空格字符([^ ]*)。您還需要捕捉裏面的明星(*):

match = re.findall(r'([^ ]*)\/PERSON', string) 
1

首先,(\w|.)匹配「單詞字符,或任何字符」(點這就是爲什麼你得到那些空間匹配任何字符)。

逃離這個用反斜槓將這樣的伎倆:(\w|\.)

其次,@Ionut Hulub指出,你可能需要使用+而不是*確保你匹配東西不過正則表達式的工作原理「最左邊,最長」,所以它總是會嘗試匹配斜線前的最長部分。

如果你想匹配你可以使用\S代替(\w|\.),這實際上可能是你想要的任何非空白字符。