如何获得字符串中的第一个单词


73

文字为:

WYATT    - Ranked # 855 with    0.006   %
XAVIER   - Ranked # 587 with    0.013   %
YONG     - Ranked # 921 with    0.006   %
YOUNG    - Ranked # 807 with    0.007   %

我只想得到

WYATT
XAVIER
YONG
YOUNG

我试过了 :

(.*)?[ ]

但这给了我:

WYATT    - Ranked

Answers:


166

正则表达式是不必要的。只需使用some_string.split(' ', 1)[0]或即可some_string.partition(' ')[0]


如果单词被其他字符(例如制表符)分隔,则不会。
orome 2013年

1
只要它们被相同的字符分开,它将可以正常工作。只需切换到即可'\t'。的确,如果您有多个定界符,即使使用2或3个定界符,也不会很难使用splitpartition代替正则表达式,这是行不通的。
Silas Ray

2
some_string.split(None, 1)[0]如果第一个单词用多个空格隔开,它将起作用。
duanev 2016年

1
假设您真的想要第一个单词,而不假定它是split数组中的第一项。想象my_string =“ 1 2 3 4 <>最酷的”。我有很多东西的正则表达式,但考虑到该字符串将返回“最酷”,则没有正则表达式。我并不认为拆分是有意义的,因为“返回第一个单词”并没有说明该工作在单词列表中的隐含顺序。
Rich Sadowsky

3
您也可以使用firstword, leftoverstring = some_string.split(' ', 1)
deanresin '19

21

如果要特别狡猾,可以这样编写:

(firstWord, rest) = yourLine.split(maxsplit=1)

这应该带来两全其美的优势:

  • 最优性调整,maxsplit同时用任何空格分割
  • 该技术的作者所言,提高了可靠性和可读性。

我有点爱上这种解决方案,它具有一般的拆包能力,因此我不得不分享它。:)


2
在python2中,您可能无法使用关键字参数,因此您可能想要像firstWord, rest = yourLine.split(None, 1)失去一些可读性一样。
巨大

我喜欢这个,简洁。而且,如果您不希望其余部分,可以使用(firstWord, *_) = yourLine.split(maxsplit=1)。使用*_而不是_因为split()根据参数返回可变数量的参数,maxsplit这将使您适应未来。
休·沃尔特斯

2
@HuwWalters我不明白为什么*maxsplit=1使用时保护自己,结果有限。
巨大

3
因为它可以避免编码错误。如果您更改了maxsplit值但未能添加额外的元组元素以解压额外的值,如中所示(firstWord, rest) = yourLine.split(maxsplit=2),则得到ValueError: too many values to unpack。另外一个好处是,您不会创建未使用的变量rest
Huw Walters

11

您应该执行以下操作:

print line.split()[0]

4
我同意。但小的优化提示:print line.split(' ', 1)[0]。这将拆分限制为第一个单词。
里卡多·克鲁兹

“ 1”在这里做什么?
algorythms

@algorythms找到第一个拆分字符后发生短路,因此您无需遍历字符串的尾部。
西拉斯·雷

10

使用此正则表达式

^\w+

\w+ 匹配1到许多字符。

\w 类似于 [a-zA-Z0-9_]

^ 描述一个字符串的开始


关于您的正则表达式

您的正则表达式(.*)?[ ]应该是,^(.*?)[ ]或者^(.*?)(?=[ ])如果您不希望空格


7

不需要一个regexstring[: string.find(' ')]


1
我认为这比splitor更加神秘partition。这样您可以获得有意义的性能还是获得内存?实际上,您必须使用此方法两次迭代令牌的第一个实例,但在另一方面,您将不会得到只是丢掉的新尾巴字符串……
Silas Ray

@ sr2222是的,它必须迭代两次,但不能插入所有字符串。
里卡多·阿尔瓦罗·洛曼

split令牌限制或都不会partition
Silas Ray

1
这种方法是一种很好的优化方法,但是如果OP希望在第一个单词是整个字符串的情况下使它起作用,则该方法就无法很好地工作。如果找不到空格,则string.find返回-1,删除最后一个字符。
里卡多·克鲁兹

2

您不需要使用正则表达式在空格上分割字符串:

In [1]: text = '''WYATT    - Ranked # 855 with    0.006   %
   ...: XAVIER   - Ranked # 587 with    0.013   %
   ...: YONG     - Ranked # 921 with    0.006   %
   ...: YOUNG    - Ranked # 807 with    0.007   %'''

In [2]: print '\n'.join(line.split()[0] for line in text.split('\n'))
WYATT
XAVIER
YONG
YOUNG
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.