繁体   English   中英

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

[英]Splitting strings using regex in python

我有多个字符串,例如:

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')]

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

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

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']]

您可以将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 ']

使用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', ' ']

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

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', ' ']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM