如何为名字和姓氏提取非大写字符串元素?

时间:2014-01-06 10:05:31

标签: python regex string extract

我有

形式的字符串
NAME Firstame

我希望获得Firstname部分。字符串可能更复杂(LAST LAST2 First First2)。规则是大写元素是姓氏,其余的是名字。我们可以假设第一部分是大写(=姓氏),当它开始是混合的情况时,它是直到结束的第一个名字。

我确信[A-Z]\w的正确正则表达式组合可行。我想出的最好的是

import re
re.findall('[A-Z]*\w+', 'LAST LAST2 First First2')

但它返回几乎正确的解决方案(['LAST', 'LAST2', 'First', 'First2']):)

将Python中的第一个名称作为一个字符串提取出来的好方法是什么?

4 个答案:

答案 0 :(得分:2)

我想提出一个非正则表达式解决方案:

string = 'LAST LAST2 First First2'
words = string.split(' ') # equals ['LAST', 'LAST2', 'First', 'First2']
result = []
for word in words:
    if not word.isupper():
        result.append(word)
print(' '.join(result))

结果:

First First2

答案 1 :(得分:1)

使用正则表达式:

import re
s = 'LAST LAST2 First First2'
print re.search("[A-Z][a-z].*$",s).group().split()
  • [A-Z]匹配A和Z之间范围内的单个字符 (区分大小写)
  • [a-z]匹配中存在的单个字符 a和z之间的范围(区分大小写)
  • .*匹配任何字符 (换行除外)量词:在零和无限时间之间,如 尽可能多次,根据需要回馈[贪心]
  • $断言 位于字符串末尾的位置

<强>非正则表达式

s = 'LAST LAST2 First First2'
print [i for i in s.split() if not i.isupper()]

<强> [OUT]:

['First', 'First2']

答案 2 :(得分:0)

尝试:

import re
re.findall('\b[A-Z][a-z0-9_-]+', 'LAST LAST2 First First2')

这将导致:

# Run findall
>>> regex.findall(string)
[u'First', u'First2']

答案 3 :(得分:0)

此代码会帮助您:

re.search("[A-Z][a-z].*$","LAST LAST2 First First2").group()

或者它可以更强大:

re.search("(?<= )[A-Z][^A-Z][\w|\s]*$","LAST LAST2 First First2").group()