【问题标题】:How to get the first word in the string如何获取字符串中的第一个单词
【发布时间】:2012-11-24 20:59:19
【问题描述】:

文字是:

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

【问题讨论】:

    标签: python regex


    【解决方案1】:

    使用这个正则表达式

    ^\w+
    

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

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

    ^ 描述字符串的开头


    关于您的正则表达式

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

    【讨论】:

      【解决方案2】:

      为此不需要正则表达式。只需使用some_string.split(' ', 1)[0]some_string.partition(' ')[0]

      【讨论】:

      • 如果单词被其他字符(例如制表符)分隔则不会。
      • 只要用同一个字符分隔就可以了。只需切换到'\t'。确实,如果您有多个分隔符,它将无法工作,尽管即使有 2 或 3 个分隔符,使用 splitpartition 代替正则表达式也不会很困难。
      • 如果多个空格分隔第一个单词,some_string.split(None, 1)[0] 将起作用。
      • 想象一下你真的想要第一个单词而不假设它是拆分数组中的第一项。想象一下 my_string = "1 2 3 4 最酷的"。我有很多东西的正则表达式,但没有一个给定字符串会返回“最酷”的东西。我不认为拆分是有意义的,因为“返回第一个单词”没有说明该作品在单词列表中的隐含顺序。
      • 您也可以使用firstword, leftoverstring = some_string.split(' ', 1)获取剩余字符串
      【解决方案3】:

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

      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
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 我认为这比splitpartition 更深奥一点。您是否以这种方式获得有意义的性能或内存增益?您基本上必须使用它两次迭代到令牌的第一个实例,但另一方面,您不会得到刚刚丢弃的新尾字符串...
        • @sr2222 是的,它必须迭代两次,但不是遍历所有字符串。
        • splitpartition 都没有令牌限制。
        • 这种方法是一个很好的优化,但如果 OP 希望它在第一个单词是整个字符串时工作,它就不能很好地工作。如果没有找到空格,string.find 返回-1,删除最后一个字符。
        【解决方案5】:

        你应该这样做:

        print line.split()[0]
        

        【讨论】:

        • 我同意。但小的优化提示:print line.split(' ', 1)[0]。这将拆分限制为第一个单词。
        • 这里的“1”是做什么的?
        • @algorythms 找到第一个拆分字符后短路,所以不要遍历字符串的尾部。
        【解决方案6】:

        如果你想感觉特别狡猾,你可以这样写:

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

        这应该是两全其美:

        我有点爱上了这个解决方案,它具有一般的拆包能力,所以我不得不分享它。

        【讨论】:

        • 在 python2 中,你可能无法使用关键字参数,所以你可能想像firstWord, rest = yourLine.split(None, 1) 这样失去一些可读性。
        • 我喜欢这个,简洁。如果您不想要该行的其余部分,您可以使用(firstWord, *_) = yourLine.split(maxsplit=1)。使用*_ 而不是_,因为split() 根据maxsplit 参数返回可变数量的参数,这将使您适应未来。
        • @HuwWalters 我不明白为什么在使用maxsplit=1 时使用* 保护自己,结果数量有限。
        • 因为它可以帮助您避免编码错误。如果您更改了maxsplit 值,但未能添加额外的元组元素来解包额外的值,如(firstWord, rest) = yourLine.split(maxsplit=2),您将得到ValueError: too many values to unpack。额外的好处是您不会创建未使用的变量rest
        猜你喜欢
        • 2013-09-04
        • 1970-01-01
        • 2022-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-15
        • 1970-01-01
        相关资源
        最近更新 更多