2012-01-05 108 views
4

使用Python和正則表達式我試圖在一段以大寫字母開頭但不在句首的文本中找到單詞。用正則表達式查找大寫字母不在句首

我能想到的最好的方法是檢查該單詞是不是前面有句號,然後是空格。我很確定我需要使用負面後視。這是我到目前爲止,它將運行,但始終沒有返回值:

(?<!\.\s)\b[A-Z][a-z]*\b 

我認爲這個問題可能與使用[AZ] [AZ] *相關的​​字邊界\ B的內部,但我真的很不確定。

感謝您的幫助。

回答

2

你的正則表達式似乎工作:

In [6]: import re 

In [7]: re.findall(r'(?<!\.\s)\b[A-Z][a-z]*\b', 'lookbehind. This is what I have') 
Out[7]: ['I'] 

確保您指定的正則表達式時,使用原始字符串(r'...')。

如果你有一些正則表達式無效的特定輸入,請將它們添加到你的問題中。

+0

感謝你的理解,那就是我沒有使用原始字符串前綴。現在完美運作。 – egd 2012-01-05 16:30:16

0

嘗試和環比與你輸入:

(?!^)\b([A-Z]\w+) 

,並拍攝第一組。正如你所看到的那樣,也可以使用負向預測,因爲你想要匹配的位置是一切,只不過是行的開始。負面的負面看法會產生相同的效果。

1

雖然你特意要求一個正則表達式,但也可能考慮一個列表理解可能很有趣。它們有時更易讀(儘管在這種情況下,可能是以效率爲代價的)。這裏有一種方法來達到這個目的:

import string 

S = "T'was brillig, and the slithy Toves were gyring and gimbling in the " + \ 
    "Wabe. All mimsy were the Borogoves, and the Mome Raths outgrabe." 

LS = S.split(' ') 

words = [x for (pre,x) in zip(['.']+LS, LS+[' ']) 
    if (x[0] in string.uppercase) and (pre[-1] != '.')] 
相關問題