如何使用python3拆分字符串

如何使用python3拆分字符串,python,regex,python-3.x,Python,Regex,Python 3.x,如何使用正则表达式拆分字符串 input : result = '1,000.03AM2,97.2323,089.301,903.230.0034,928.9911,24.30AM' 希望将其拆分,以便将其存储到不同的字符串中,以便进一步使用,如下所示 o/p should be : a = 1,000.03AM, b = 2,97.23, c = 23,089.30, d = 1,903.23, e = 0.00, f = 34,928.99, g = 11,24.30AM 我试过这样做,

如何使用正则表达式拆分字符串

input :
result = '1,000.03AM2,97.2323,089.301,903.230.0034,928.9911,24.30AM'
希望将其拆分,以便将其存储到不同的字符串中,以便进一步使用,如下所示

o/p should be :
a = 1,000.03AM, b = 2,97.23, c = 23,089.30, d = 1,903.23, e = 0.00, f = 34,928.99, g = 11,24.30AM
我试过这样做,但它显示出错误的输出

import re
print(re.findall(r'[0-9.]+|[^0-9.]', result))

您可以使用

re.findall(r'\d+(?:,\d+)*(?:\.\d{2})?[^,\d]*', text)

详细信息

  • \d+
    -1+位
  • (?:,\d+)*
    -0或更多逗号和1+数字的重复
  • (?:\。\d{2})
    -一个点和两个数字的可选匹配项
  • [^,\d]*
    -除逗号和数字以外的任何0个或更多字符
:


您可以使用

re.findall(r'\d+(?:,\d+)*(?:\.\d{2})?[^,\d]*', text)

详细信息

  • \d+
    -1+位
  • (?:,\d+)*
    -0或更多逗号和1+数字的重复
  • (?:\。\d{2})
    -一个点和两个数字的可选匹配项
  • [^,\d]*
    -除逗号和数字以外的任何0个或更多字符
:


如果字符串长度及其参数保持不变,则提供。 最有效的解决办法是

a = result[0:10]
b = result[10:17]
c = result[17:26]
d = result[26:34]
e = result[34:38]
f = result[38:47]

希望这有帮助。

如果字符串长度及其参数保持不变,则提供该选项。 最有效的解决办法是

a = result[0:10]
b = result[10:17]
c = result[17:26]
d = result[26:34]
e = result[34:38]
f = result[38:47]

希望这对您有所帮助。

对于您的结果,您需要以下正则表达式:

re.findall(r“[\d,]+\.\d{2}(?:AM)?”,结果)
这将产生以下结果:

['1000.03AM'、'2,97.23'、'23089.30'、'1903.23'、'0.00'、'34928.99'、'11,24.30AM']
正则表达式解释:

  • [\d,]
    -匹配数字和逗号
  • [\d,]+\.\d{2}
    -匹配整个浮点值(点后有两个摘要)
  • (?:AM)?
    -在非捕获组中匹配可选的
    AM
    ,在下面的示例中,我使用
    (?=AM)?
    将其不包括在结果中
  • 如果您在
    AM
    处有任何其他内容,您可以将
    (?:AM)
    编辑为
    (?:AM |其他|…)
如果需要将其解析为float,我有两个建议。首先是删除逗号:

map(lambda x:float(x.replace(“,”,”)),re.findall(r“[\d,]+\。\d{2}(?=AM)?”,s))
结果:

[1000.03297.2323089.31903.230.034928.991124.3]
另一种变体是使用
locale

导入区域设置 >>>setlocale(locale.LC_ALL'en_US.UTF8') ‘en_US.UTF8’ >>>列表(映射(lambda x:locale.atof(x),re.findall(r“[\d,]+\.\d{2}(?=AM)?”,s))) [1000.03, 297.23, 23089.3, 1903.23, 0.0, 34928.99, 1124.3]
对于结果,您需要以下正则表达式:

re.findall(r“[\d,]+\.\d{2}(?:AM)?”,结果)
这将产生以下结果:

['1000.03AM'、'2,97.23'、'23089.30'、'1903.23'、'0.00'、'34928.99'、'11,24.30AM']
正则表达式解释:

  • [\d,]
    -匹配数字和逗号
  • [\d,]+\.\d{2}
    -匹配整个浮点值(点后有两个摘要)
  • (?:AM)?
    -在非捕获组中匹配可选的
    AM
    ,在下面的示例中,我使用
    (?=AM)?
    将其不包括在结果中
  • 如果您在
    AM
    处有任何其他内容,您可以将
    (?:AM)
    编辑为
    (?:AM |其他|…)
如果需要将其解析为float,我有两个建议。首先是删除逗号:

map(lambda x:float(x.replace(“,”,”)),re.findall(r“[\d,]+\。\d{2}(?=AM)?”,s))
结果:

[1000.03297.2323089.31903.230.034928.991124.3]
另一种变体是使用
locale

导入区域设置 >>>setlocale(locale.LC_ALL'en_US.UTF8') ‘en_US.UTF8’ >>>列表(映射(lambda x:locale.atof(x),re.findall(r“[\d,]+\.\d{2}(?=AM)?”,s))) [1000.03, 297.23, 23089.3, 1903.23, 0.0, 34928.99, 1124.3]

@shaikmoeed是的。edited字符串的最大长度是多少?
AM
代表什么?上午/下午?看起来您应该将其解析为float,但包含AM/PM将使其成为字符串,除非它
time
@Abhi您的预期结果与Wiktor提到的上述正则表达式不匹配。@shaikmoeed,但我的答案包含与预期匹配的解决方案。@shaikmoeed yes。edited字符串的最大长度是多少?
AM
代表什么?上午/下午?看起来应该将其解析为float,但包含AM/PM将使其成为字符串,除非
time
@Abhi,否则您的预期结果与Wiktor提到的上述正则表达式不匹配。@shaikmoeed,但我的答案包含与预期匹配的解决方案。这将第一个元素命名为
'1000.03AM2'
,它应该位于OP提到的
'1000.03AM'
。@shaikmoeed我已恢复为原始建议。但仍然与OP的预期输出不匹配。
之后应该只有两个数字(如果存在,加上两个字母)。但结果是
928.9911
好的,现在是这样。这给出了第一个元素为
'1000.03AM2'
,它应该位于OP提到的
'1000.03AM'
位置。@shaikmoeed我已恢复到原始建议。但仍然与OP的预期输出不匹配。
之后应该只有两位数字(如果存在,加上两个字母)。但结果是
928.9911
好的,现在是这样。我怀疑
AM
可选部分可能丢失或出现在任意逗号分隔的字段中,因此这最终可能不会有帮助。如果字母字符不重要,那么您可以尝试这个re.findall(r“[\d,]+\.\d{2}”,结果)这将是完美的。re.findall(r“([\d,]+\.\d{2}[A-Z]{2}?[\d,]+\.\d{2})”,result)我怀疑
AM
可选部分可能丢失或出现在任意逗号分隔的字段中,因此这最终可能不会有帮助。如果字母字符不重要,那么您可以尝试这个re.findall(r“[\d,]+.\d},result)这将是完美的。re.findall(r)([\d,]+\.\d{2}[A-Z]{2}?