2017-06-19 38 views
1

我需要在python中編寫一個正則表達式,它可以從首字母大寫的文本中找到單詞,這些單詞可以是單個或連續的。要找到首字母大寫的單詞(一個或多個連續)?

例如,對於句子

Dallas Buyer Club is a great American biographical drama film,co-written by Craig Borten and Melisa Wallack, and Directed by Jean-Marc Vallee. 

expexted輸出應該

'Dallas Buyer Club', 'American', 'Craig Borten', 'Melisa Wallack', 'Directed', 'Jean-Marc Vallee' 

我寫這個正則表達式,

([A-Z][a-z]+(?=\s[A-Z])(?:\s[A-Z][a-z]+)+) 

但這個輸出是

'Dallas Buyer Club', 'Craig Borten, 'Melisa Wallack', 'Jean-Marc Valee' 

它只能打印連續第一個大寫單詞,而不是單一的話就像

'American', 'Directed' 

也正則表達式,

[A-Z][a-z]+ 

打印所有的話,但個別,

'Dallas', 'Buyers', 'Club' and so on. 

請幫助我解決這個問題。 。

回答

0

我想你混淆了括號(並進行正則表達式有點太複雜,簡單地使用:

[A-Z][a-z]+(?:\s[A-Z][a-z]+)*

所以在這裏我們有一個匹配的部分[A-Za-z]+,併爲了配合以上的團體,我們只是使用(...)*重複...或多次。在...我們包括分離器(S)(這裏\s),並再次組([A-Z][a-z]+)。

然而,這將不包括在'Jean''Marc'之間的連字符。爲了將它包括在內,我們可以擴大\s

[A-Z][a-z]+(?:[\s-][A-Z][a-z]+)*

根據一些其他字符(或字符序列)的允許,你可能不得不進一步改變[\s-]部分)。

這就產生:

>>> rgx = re.compile(r'[A-Z][a-z]+(?:[\s-][A-Z][a-z]+)*') 
>>> txt = r'Dallas Buyer Club is a great American biographical drama film,co-written by Craig Borten and Melisa Wallack, and Directed by Jean-Marc Vallee.' 
>>> rgx.findall(txt) 
['Dallas Buyer Club', 'American', 'Craig Borten', 'Melisa Wallack', 'Directed', 'Jean-Marc Vallee'] 

編輯:如果剩餘的字符可以是大寫,以及,你可以使用:

[A-Z][A-Za-z]+(?:[\s-][A-Z][A-Za-z]+)*

注意,這將匹配單詞,2或更多字符。如果一個字字符應匹配,以及像'J R R Tolkien',那麼你可以這樣寫:

[A-Z][A-Za-z]*(?:[\s-][A-Z][A-Za-z]*)*
+0

感謝您的答覆先生,現在還沒有給單個大寫單詞「美國」和「導演」(僅適用於連續字),我想要兩個 –

+0

@ SejwalVineet:我已經編輯了答案。 –

+0

現在它正在工作,先生如果文本包含像艾滋病毒或艾滋病的所有大寫單詞,那麼如何在上面寫一個正則表達式,我已經寫了正則表達式爲'[AZ] + [\ s-]',這可以如何整合 –

相關問題