我需要在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.
请帮我解决这个问题。
答案 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'