如何使用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)
见
详细信息
-1+位\d+
-0或更多逗号和1+数字的重复(?:,\d+)*
-一个点和两个数字的可选匹配项(?:\。\d{2})
-除逗号和数字以外的任何0个或更多字符[^,\d]*
您可以使用
re.findall(r'\d+(?:,\d+)*(?:\.\d{2})?[^,\d]*', text)
见
详细信息
-1+位\d+
-0或更多逗号和1+数字的重复(?:,\d+)*
-一个点和两个数字的可选匹配项(?:\。\d{2})
-除逗号和数字以外的任何0个或更多字符[^,\d]*
如果字符串长度及其参数保持不变,则提供。 最有效的解决办法是
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 |其他|…)
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 |其他|…)
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}?