我有
形式的字符串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中的第一个名称作为一个字符串提取出来的好方法是什么?
答案 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()