2017-06-19 95 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-]',这可以如何整合 –

相关问题