Regex,它将在事务中查找描述

l3zydbqr  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(80)

编译格式中的文本行,

26 Jan The Gym Debit Card Transaction £656.40

字符串
我能够编译日期,交易的价值和交易的类型,但不确定如何编译描述(健身房),因为它的长度和空间取决于每行代码。

company_re = re.compile(r'[^\d+ \w{3}+\(Debit Card Transaction Mobile|Online Transacti…|Direct Debit|Standing Order|Automated Credit|)\£\d+.\d\d]')


这是我最后一次尝试,我的想法是拒绝所有固定模式的东西,但似乎不起作用。

dkqlctbz

dkqlctbz1#

你可以试试(Regex101):
注意:我使用了详细标志(?x)来使模式更具可读性

import re

pattern = r'''(?x)
(\d+\s\w{3})\s                              # match the date
(.*?)                                       # match the name
(                                           # match the transaction type
    Debit\ Card\ Transaction |
    Debit\ Card\ Transaction\ Mobile |
    Standing\ Order |
    Debit\ Card\ Transaction
)\s
(\£\d+\.?\d*)                               # match the amount
'''

text = '''\
26 Jan The Gym Debit Card Transaction £656.40
16 Dec Other stuff Standing Order £56.40
1 Feb Some Other stuff Debit Card Transaction Mobile £6'''

for date, name, type_, amount in re.findall(pattern, text):
    print(date, name, type_, amount, sep='\n')
    print('-'*80)

字符串
印刷品:

26 Jan
The Gym 
Debit Card Transaction
£656.40
--------------------------------------------------------------------------------
16 Dec
Other stuff 
Standing Order
£56.40
--------------------------------------------------------------------------------
1 Feb
Some Other stuff 
Debit Card Transaction Mobile
£6
--------------------------------------------------------------------------------

tag5nh1u

tag5nh1u2#

您当前方法的问题:

  • 你把所有的东西都放在一个否定的字符集中:[^...]。这完全破坏了RegEx,没有任何意义。
  • 你不可能穷尽所有可能的描述。这也非常容易出错。相反,你应该通过它不是什么来识别“中间部分”(描述):它不是日期或值。
  • 你忘了在RegEx中转义小数点.;你的RegEx会匹配值的数字之间的任何字符

下面是我建议的RegEx:(\d+\s+\w{3}+)\s+(.+?)\s+(£\d+\.\d\d)

  • (\d+\s+\w{3}+):匹配并捕获日期,与您的RegEx中相同
  • \s+(.+?)\s+:匹配并捕获一个空格分隔的“中间部分”(描述),使其尽可能短(我们不希望空格进入描述)
  • (£\d+\.\d\d):匹配并捕获以英镑为单位的交易的尾随值

确保每行使用re.fullmatch或使用^$锚点。

相关问题