我有一个帐户信息字符串,字符串中有多个帐户(示例显示一行,其中我实际上有一个包含多行帐户数据的文本文件,因此在我的代码中有另一个循环遍历文本文件中的每一行)。我需要把每个账户都存入自己的账户。下面的代码可以工作,但我认为有一种更有效或更好的方法。我刚开始学习正则表达式。
import re
import pandas as pd
allAccounts = []
example = '02-0015800-00 NAME1 100 SOME ST Active 3/8/2021 139.23 139.81 0.42 02-0023901-01 NAME2 101 SOME ST Active 3/8/2021 512.33 482.96 -5.73'
rex = '[0-9]{1,2}-[0-9]{1,7}-[0-9]{1,2}'
accounts = re.findall(rex, example)
for account in accounts:
example= example.replace(account, f'||{account}')
example = [account.replace(' ', '|').split('|') for account in example.split('||')][1:]
allAccounts += example
df = pd.DataFrame(allAccounts)
df
从代码的正则表达式部分,我希望它返回:
['02-0015800-00 NAME1 100 SOME ST Active 3/8/2021 139.23 139.81 0.42', ' 02-0023901-01 NAME2 101 SOME ST Active 3/8/2021 512.33 482.96 -5.73']
# or
'||02-0015800-00 NAME1 100 SOME ST Active 3/8/2021 139.23 139.81 0.42 ||02-0023901-01 NAME2 101 SOME ST Active 3/8/2021 512.33 482.96 -5.73'
代码返回以下df,这是我最终想要的:
0 1 2 3 4 5 6 7 8
0 02-0015800-00 NAME1 100 SOME ST Active 3/8/2021 139.23 139.81 0.42
1 02-0023901-01 NAME2 101 SOME ST Active 3/8/2021 512.33 482.96 -5.73 None
但我觉得有一个更好的方法来使用正则表达式比我所做的。阅读文档,似乎re.sub
应该这样做,但它只替换它遇到的第一个帐号,它只想替换帐号,而不是在开头添加'||'分隔符。
使用下面的代码,它接近我想要的,但不确定为什么列表中的第一项是"。
example = '02-0015800-00 NAME1 100 SOME ST Active 3/8/2021 139.23 139.81 0.42 02-0023901-01 NAME2 101 SOME ST Active 3/8/2021 512.33 482.96 -5.73'
rex = re.compile('(?=[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9])')
re.split(rex, example)
输出:
['',
'02-0015800-00 NAME1 100 SOME ST Active 3/8/2021 139.23 139.81 0.42 ',
'02-0023901-01 NAME2 101 SOME ST Active 3/8/2021 512.33 482.96 -5.73']
不使用分割,您可以匹配值:
bdd-d{7}-ddb.*?(?=s*bdd-d{7}-ddb.*?|$)
bdd-d{7}-ddb
使用限定词 匹配2位数- 7位数- 2位数的模式.*?
尽可能匹配任意字符(?=s*bdd-d{7}-ddb.*?|$)
正向向前看,断言数字模式向右或字符串的末尾,也匹配最后一次出现
Regex演示
例子import re
pattern = r"bdd-d{7}-ddb.*?(?=s*bdd-d{7}-ddb.*?|$)"
s = "02-0015800-00 NAME1 100 SOME ST Active 3/8/2021 139.23 139.81 0.42 02-0023901-01 NAME2 101 SOME ST Active 3/8/2021 512.33 482.96 -5.73"
print(re.findall(pattern, s))
输出['02-0015800-00 NAME1 100 SOME ST Active 3/8/2021 139.23 139.81 0.42', '02-0023901-01 NAME2 101 SOME ST Active 3/8/2021 512.33 482.96 -5.73']
如果必须使用split:
进口re
pattern = r"b(?=dd-d{7}-ddb)"
s = "02-0015800-00 NAME1 100 SOME ST Active 3/8/2021 139.23 139.81 0.42 02-0023901-01 NAME2 101 SOME ST Active 3/8/2021 512.33 482.96 -5.73"
result = [m.strip() for m in re.split(pattern, s) if m]
print(result)
查看Python演示