2013-12-17 78 views
3

短的問題:Python的正則表達式:匹配所有連續大寫單詞

我有一個字符串:

title="Announcing Elasticsearch.js For Node.js And The Browser" 

我想找到所有對單詞的每個單詞正確大寫的。

因此,預期輸出應該是:

['Announcing Elasticsearch.js', 'Elasticsearch.js For', 'For Node.js', 'Node.js And', 'And The', 'The Browser'] 

我現在所擁有的是這樣的:

'[A-Z][a-z]+[\s-][A-Z][a-z.]*' 

這使我的輸出:

['Announcing Elasticsearch.js', 'For Node.js', 'And The'] 

我怎樣才能改變我的正則表達式給予期望的輸出?

+1

可能相關:http://stackoverflow.com/q/15799332/1578604 – Jerry

+0

這聽起來像你想要將最後一個匹配的位置向後移動一個詞。將兩人一組而不是一次全部拿走可以嗎? – mtanti

+0

@mtanti我想這應該是單身我只會解析5-7個字符串。 –

回答

2

可以使用此:

#!/usr/bin/python 
import re 

title="Announcing Elasticsearch.js For Node.js And The Browser TEst" 
pattern = r'(?=((?<![A-Za-z.])[A-Z][a-z.]*[\s-][A-Z][a-z.]*))' 

print re.findall(pattern, title) 

「正常」 模式無法比擬的重疊子,所有角色全部成立一次。然而,前瞻(?=..)(即「後跟」)只是一張支票,並且沒有任何匹配。它可以多次解析字符串。因此,如果您將捕獲組放在預見範圍內,則可以獲得重疊的子字符串。

+0

你能解釋一下這個工作方式嗎?也許是一個詳細的版本? –

+1

詳細解釋如下:http://regex101.com/r/xE2vT0 – brandonscript

0

有可能是一個更有效的方式來做到這一點,但你可以使用這樣的正則表達式:

(\b[A-Z][a-z.-]+\b) 

然後通過捕捉組迭代像這個表達式所以測試:(^[A-Z][a-z.-]+$),確保匹配的組(當前)匹配匹配的組(下一個)。

工作實施例:

import re 

title = "Announcing Elasticsearch.js For Node.js And The Browser" 
matchlist = [] 
m = re.findall(r"(\b[A-Z][a-z.-]+\b)", title) 
i = 1 
if m: 
    for i in range(len(m)): 
     if re.match(r"(^[A-Z][a-z.-]+$)", m[i - 1]) and re.match(r"(^[A-Z][a-z.-]+$)", m[i]): 
      matchlist.append([m[i - 1], m[i]]) 

print matchlist 

輸出:

[ 
    ['Browser', 'Announcing'], 
    ['Announcing', 'Elasticsearch.js'], 
    ['Elasticsearch.js', 'For'], 
    ['For', 'Node.js'], 
    ['Node.js', 'And'], 
    ['And', 'The'], 
    ['The', 'Browser'] 
] 
0

如果此刻你的Python代碼是這樣

title="Announcing Elasticsearch.js For Node.js And The Browser" 
results = re.findall("[A-Z][a-z]+[\s-][A-Z][a-z.]*", title) 

那麼你的程序被跳過奇數對。一個簡單的解決辦法是跳過第一個字像這樣以後研究的模式:

m = re.match("[A-Z][a-z]+[\s-]", title) 
title_without_first_word = title[m.end():] 
results2 = re.findall("[A-Z][a-z]+[\s-][A-Z][a-z.]*", title_without_first_word) 

現在只需與結果相結合,並RESULT2在一起。

相關問題