要找到首都大写的单词(一个或多个连续)?

时间:2017-06-19 09:30:46

标签: python regex

我需要在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. 

exxted输出应

'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.

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

我认为你混淆了括号(并使正则表达式有点过于复杂。只需使用:

explode('@', Route::getCurrentRoute()->getActionName())[1]

所以我们在这里有一个匹配的部分[A-Z][a-z]+(?:\s[A-Z][a-z]+)*,为了匹配更多的群组,我们只需使用[A-Za-z]+重复(...)* 或更多次。在...中,我们包含了分隔符(此处为...),再次包含该组(\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]+)*,那么你可以写:

'J R R Tolkien'