【问题标题】:Python regular expression split string into numbers and text/symbolsPython正则表达式将字符串拆分为数字和文本/符号
【发布时间】:2017-08-31 10:20:32
【问题描述】:

我想将字符串拆分为数字部分和文本/符号部分 我当前的代码不包含负数或小数,并且行为怪异,在输出末尾添加了一个空列表元素

import re
mystring = 'AD%5(6ag 0.33--9.5'
newlist = re.split('([0-9]+)', mystring)
print (newlist)

当前输出:

['AD%', '5', '(', '6', 'ag ', '0', '.', '33', '--', '9', '.', '5', '']

想要的输出:

['AD%', '5', '(', '6', 'ag ', '0.33', '-', '-9.5']

【问题讨论】:

  • 模式'(-?[0-9\.]+)' 为您提供所需的输出,但也会有几个空字符串
  • @ryugie 谢谢!知道为什么要添加一个空字符串吗?
  • 尝试re.split(r'(-?\d*\.?\d+)', s),并使用filter(None, result)删除空值。
  • @new_to_coding - 它添加了一个空字符串,因为您在数字上进行拆分,即使用数字作为分隔符,因此空字符串是分隔符之间的内容。这些数字显示在您的列表中只是因为您将模式包裹在括号中,因此您也捕获了分隔符。
  • @ryugie 很有趣,谢谢

标签: python regex parsing


【解决方案1】:

您的问题与您的正则表达式捕获一个或多个数字并将它们添加到结果列表中并且数字用作分隔符这一事实有关,考虑了之前和之后的部分。因此,如果末尾有数字,则拆分结果将末尾的空字符串添加到结果列表中。

您可以使用匹配浮点数或带有可选减号的整数的正则表达式进行拆分,然后删除空值:

result = re.split(r'(-?\d*\.?\d+)', s)
result = filter(None, result)

要将负数/正数与指数匹配,请使用

r'([+-]?\d*\.?\d+(?:[eE][-+]?\d+)?)'

-?\d*\.?\d+ 正则表达式匹配:

  • -? - 可选减号
  • \d* - 0+ 位
  • \.? - 一个可选的文字点
  • \d+ - 一位或多位数字。

【讨论】:

    【解决方案2】:

    很遗憾,re.split() 不提供“忽略空字符串”选项。但是,要检索您的号码,您可以轻松地使用 re.findall() 和不同的模式:

    import re
    
    string = "AD%5(6ag0.33-9.5"
    rx = re.compile(r'-?\d+(?:\.\d+)?')
    numbers = rx.findall(string)
    
    print(numbers)
    # ['5', '6', '0.33', '-9.5']
    

    【讨论】:

    • 太棒了,谢谢,但不是我需要做的,但对于提取数字非常有用
    【解决方案3】:

    如前所述,没有选项可以忽略 re.split() 中的空字符串,但您可以通过以下方式轻松构建新列表:

    import re
    
    mystring = "AD%5(6ag0.33--9.5"
    newlist = [x for x in re.split('(-?\d+\.?\d*)', mystring) if x != '']
    print newlist
    

    输出:

    ['AD%', '5', '(', '6', 'ag', '0.33', '-', '-9.5']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多