更好的使用正则表达式的方式



我有一个帐户信息字符串,字符串中有多个帐户(示例显示一行,其中我实际上有一个包含多行帐户数据的文本文件,因此在我的代码中有另一个循环遍历文本文件中的每一行)。我需要把每个账户都存入自己的账户。下面的代码可以工作,但我认为有一种更有效或更好的方法。我刚开始学习正则表达式。

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演示

相关内容

最新更新