在python中使用正则表达式拆分字符串

时间:2018-08-22 18:47:46

标签: python regex python-3.x

我有多个字符串,如:

a = 'avg yearly income 25,07,708.33 '
b = 'current balance 1,25,000.00 in cash\n'
c = 'target savings 50,00,000.00 within next five years 1,000,000.00 '

我正在尝试将它们分成文本字符串和数字字符串,并带有以下示例输出:

aa = [('avg yearly income', '25,07,708.33')]
bb = [('current balance', '1,25,000.00', 'in cash')]
cc = [('target savings', '50,00,000.00', 'within next five years', '1,000,000.00')]

我正在使用以下代码:

import re
b = b.replace("\n","")
aa = re.findall(r'(.*)\s+(\d+(?:,\d+)*(?:\.\d){1,2})', a)
bb = re.findall(r'(.*)\s+(\d+(?:,\d+)*(?:\.\d){1,2})(.*)\s+', b)
cc = re.findall(r'(.*)\s+(\d+(?:,\d+)*(?:\.\d){1,2})(.*)\s+(\d+(?:,\d+)*(?:\.\d{1,2})?)', c)

我得到以下输出:

aa = [('avg yearly income', '25,07,708.3')]
bb = [('current balance', '1,25,000.0', '0 in')]
cc = [('target savings', '50,00,000.0', '0 within next five years', '1,000,000.00')]

正则表达式的模式有什么问题?

4 个答案:

答案 0 :(得分:2)

您可以使用re.findall代替re.split,在由字母和数字限定的空格上分割字符串:

import re
d = ['avg yearly income 25,07,708.33 ', 'current balance 1,25,000.00 in cash\n', 'target savings 50,00,000.00 within next five years 1,000,000.00 ']
final_results = [re.split('(?<=[a-zA-Z])\s(?=\d)|(?<=\d)\s(?=[a-zA-Z])', i) for i in d]
new_results = [[i.rstrip() for i in b] for b in final_results]

输出:

[['avg yearly income', '25,07,708.33'], ['current balance', '1,25,000.00', 'in cash'], ['target savings', '50,00,000.00', 'within next five years', '1,000,000.00']]

答案 1 :(得分:1)

您可以将re.split与ptrn r'(?<=\d)\s+(?=\w)|(?<=\w)\s+(?=\d)'

一起使用
>>> ptrn = r'(?<=\d)\s+(?=\w)|(?<=\w)\s+(?=\d)'
>>> re.split(ptrn, a)
['avg yearly income', '25,07,708.33 ']
>>> re.split(ptrn, b)
['current balance', '1,25,000.00', 'in cash\n']
>>> re.split(ptrn, c)
['target savings', '50,00,000.00', 'within next five years', '1,000,000.00 ']

答案 2 :(得分:0)

使用re.split();此示例使用您的原始regexp,它可以正常工作:

>>> r = re.compile(r'(\d+(?:,\d+)*(?:\.\d{1,2}))')
>>> r.split('avg yearly income 25,07,708.33 ')
['avg yearly income ', '25,07,708.33', ' ']
>>> r.split('current balance 1,25,000.00 in cash\n')
['current balance ', '1,25,000.00', ' in cash\n']
>>> r.split('target savings 50,00,000.00 within next five years 1,000,000.00 ')
['target savings ', '50,00,000.00', ' within next five years ', '1,000,000.00', ' ']

答案 3 :(得分:0)

您可以按照上述答案中的说明使用分割。

import re
a = 'avg yearly income 25,07,708.33 '
b = 'current balance 1,25,000.00 in cash\n'
c = 'target savings 50,00,000.00 within next five years 1,000,000.00 '

aa = re.split(r'(\d+(?:,\d+)*(?:\.\d{1,2}))', a)
bb = re.split(r'(\d+(?:,\d+)*(?:\.\d{1,2}))', b)
cc = re.split(r'(\d+(?:,\d+)*(?:\.\d{1,2}))', c)

print(aa)
print(bb)
print(cc)

您可以获得类似的输出

['avg yearly income ', '25,07,708.33', ' ']
['current balance ', '1,25,000.00', ' in cash\n']
['target savings ', '50,00,000.00', ' within next five years ', '1,000,000.00', ' ']