Python正则表达式:提取第一个大写单词或者如果前两个单词都是大写的话,提取前两个单词。

3

我已经实现了正则表达式公式,可以从给定字符串中提取前两个大写单词。如果第二个单词没有大写字母,我希望能够只提取字符串中的第一个单词。

以下是一些例子:

s = 'Smith John went to ss for Jones.'
s = 'Jones, Greg went to 2b for Smith.'
s = 'Doe went to ss for Jones.'

基本上,我只是希望正则表达式输出以下内容:
'Smith John'
'Jones, Greg'
'Doe'

我当前的正则表达式公式如下,但它无法捕获Doe这个示例:

new = re.findall(r'([A-Z][\w-]*(?:\s+[A-Z][\w-]*)+)', s)
2个回答

3
正则表达式过于复杂,str.isupper() 能够很好地完成任务。
In [11]: def getName(s):
    ...:     first, second = s.split()[:2]
    ...:     if first[0].isupper():
    ...:         if second[0].isupper():
    ...:             return ' '.join([first, second])
    ...:         return first
    ...:     

这会得到:
In [12]: getName('Smith John went to ss for Jones.')
Out[12]: 'Smith John'

In [13]: getName('Jones, Greg went to 2b for Smith.')
Out[13]: 'Jones, Greg'

In [14]: getName('Doe went to ss for Jones.')
Out[14]: 'Doe'

加入一些检查,以避免在您的字符串仅包含一个单词时发生错误,然后您就可以开始了。


如果你想使用正则表达式,你可以使用这样的模式:

In [36]: pattern = re.compile(r'([A-Z].*? ){1,2}')

In [37]: pattern.match('Smith John went to ss for Jones.').group(0).rstrip()
Out[37]: 'Smith John'

In [38]: pattern.match('Doe went to ss for Jones.').group(0).rstrip()
Out[38]: 'Doe'

r'([A-Z].*? ){1,2}'将匹配第一个单词,如果第二个单词也是大写字母开头,则也会匹配。


太棒了,非常感谢你清晰明了的回答!这个方法非常有效,我肯定是想得太多了... - rahlf23
@RickAhlf 很高兴我能帮到你。我还额外添加了一个正则表达式的解决方案。谢谢 :) - cs95
非常感谢! - rahlf23

0
import re
print re.match(r'([A-Z].*?(?:[, ]+)){1,}',s).group()

您是否介意添加更多的背景信息来解释您所做的事情?否则,您可能会冒着答案被删除的风险。 - Naveen Vijay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接