【问题标题】:How to split numbers and text from a sentence?如何从句子中拆分数字和文本?
【发布时间】:2021-09-18 13:11:00
【问题描述】:

我有一个句子混合了数字(整数和浮点数),并且经常与其他单词合并。我想把数字和文字分开,放在一个句子里。

下面做了一些工作。

str1 = str1="test1.25nb 5test .5NB 00.5my_test 5unit 5.6"
re.findall(r'\d*\.*\d+\.*\d*', str1)
re.split(r'\d*\.*\d+\.*\d*',  str1)

但是,我想不出更好的方法来很好地给出结果。

Input: str1="test1.25nb 5test .5NB 00.5my_test 5unit 5.6"

Expected output: test 1.25 nb 5 test .5 NB 00.5 my_test 5 unit 5.6"

提前致谢。

【问题讨论】:

  • 这些字符串是否更多,如果有,它们是否遵循某种模式?

标签: python-3.x regex string


【解决方案1】:

你可以使用

import re
str1 = "test1.25nb 5test .5NB 00.5my_test 5unit 5.6"
print( " ".join(re.split(r'\s*(\d*\.?\d+)\s*', str1)) )
# => test 1.25 nb 5 test .5 NB 00.5 my_test 5 unit 5.6 

或者,直接使用re.sub,最后加上strip()

print( re.sub(r'\s*(\d*\.?\d+)\s*', r' \1 ', str1).strip() )

请参阅Python demo\s*(\d*\.?\d+)\s* 正则表达式匹配

  • \s* - 零个或多个空格
  • (\d*\.?\d+) - 捕获到第 1 组(因此这些值也出现在使用 re.split 生成的结果列表中)零个或多个数字,可选的 . 和一个或多个数字
  • \s* - 零个或多个空格。

请参阅regex demo

【讨论】:

    【解决方案2】:

    如果你不拘泥于正则表达式,这可能会更容易理解:

    import string
    
    str1 = "test1.25nb 5test .5NB 00.5my_test 5unit 5.6"
    cnt = len(str1)
    str2 = ""
    numdigits = string.digits + "."
    
    print(str1)
    for i, c in enumerate(str1):
        str2 += c
        if i < cnt - 1:
            nextc = str1[i + 1]
            if c in numdigits and nextc in string.ascii_letters or c in string.ascii_letters and nextc in numdigits:
                str2 += " "
    print(str2)
    

    基本逻辑很简单:对于每个字符,在下一个字符处达到峰值,并查看字母和数字状态之间是否有变化。如果是这样,请插入一个空格。

    请注意,enumerate(list) 内置函数返回一对值,一个索引值,后跟列表的下一个元素。这可以简化循环内的索引过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 2021-10-01
      • 2017-04-18
      • 1970-01-01
      相关资源
      最近更新 更多