gpt4 book ai didi

Python:混合场景正则表达式

转载 作者:行者123 更新时间:2023-11-30 22:24:21 24 4
gpt4 key购买 nike

我已经为此苦苦挣扎了一段时间,但几乎两手空空。

我正在将文件解析为 pandas 数据帧,然后将其转储到 mysql,并且我有一组具有如下变化的行:

523421 F-INV PROC 11/01 01:00:00
634312 MA-BAREAUTH 11/01 01:00:00
523421 MK-PERM YEAR 11/01 01:00:00
123512 G5-FSB 3.00 11/01 01:00:00
864982 JA-PAREN 4.25* 11/01 01:00:00
934821 4.00 11/01 01:00:00
620021 I-MAS DIN 5.25* 11/01 01:00:00
969722 MS-DARE .35 11/01 01:00:00

我试图将每一行翻译成 4 组,无论组是否为空。到目前为止,我已经在以下正则表达式方面取得了进展,但是如果日期戳之前没有\d.\d{2} 匹配,则它不起作用:

(\d{6}).([^\d]*).([^\s][\.]\d+[\*]*).(\d{2}\/\d{2}\s\d{2}\:\d{2}\:\d{2})

这个想法是将一行像分组

969722 MS-DARE 1.35 11/01 01:00:00

像这样:

969722 MS-DARE 1.35 11/01 01:00:00

这适用于诸如969722 MS-DARE 1.35 11/01 01:00:00 但当 group2 中有空格时会中断,例如:

969722 MS-DARE PIN .35 11/01 01:00:00 我想将其分组为 969722 MS-DARE PIN 1.35 11/01 01:00:00

总体而言,最终目标是拥有所有这些变体组,例如:

523421 F-INV PROC .95 11/01 01:00:00

634312 MA-BAREAUTH 11/01 01:00:00

523421 MK-PERM YEAR 11/01 01:00:00

123512 G5-FSB 3.00 11/01 01:00:00

864982 JA-PAREN 4.25* 11/01 01:00:00

934821 4.00 11/01 01:00:00

620021 I-MAS DIN 5.25* 11/01 01:00:00

969722 MS-DARE .35 11/01 01:00:00

如何考虑所有这些变化,以便我始终有 4 个组,并且如果存在 3.00 或 0.35 之类的金额,则它是第 3 组,否则为空?

更新:

https://regex101.com/r/lL8rIj/1/

这里越来越近了,但如果没有数量,我需要为每场比赛提供一个空的组 3..

最佳答案

看来你可以使用

^                                      # start of line
(?P<group1>\d+)\s # capture numbers, match whitespace
(?P<group2>(?:(?!\d*\.\d+|\d{2}/).)+)? # capture as long as the formats
# of group 3 and 4 are not met
# the group is optional
(?P<group3>\d*\.\d+\*?)?\s+ # format of group 3...
(?P<group4>\d+/\d+.+) # ... and 4 respectively
$ # end of line

参见a demo on regex101.com

<小时/>在 Pythonpandas 中,这将是:

import re, pandas as pd

string = """
864982 JA-PAREN 4.25* 11/01 01:00:00
934821 4.00 11/01 01:00:00
620021 I-MAS DIN 5.25* 11/01 01:00:00
969722 MS-DARE AUT .35 11/01 01:00:00
523421 F-INV PROC 11/01 01:00:00
634312 MA-BAREAUTH 11/01 01:00:00
523421 MK-PERM YEAR 11/01 01:00:00
123512 G5-FSB 3.00 11/01 01:00:00
"""

rx = re.compile(r'''
^
(?P<group1>\d+)\s
(?P<group2>(?:(?!\d*\.\d+|\d{2}/).)+)?
(?P<group3>\d*\.\d+\*?)?\s+
(?P<group4>\d+/\d+.+)
$''', re.VERBOSE | re.MULTILINE)

records = ((m.group(1), m.group(2).rstrip() if m.group(2) else None,
m.group(3), m.group(4))
for m in rx.finditer(string))

df = pd.DataFrame(records)
print(df)

<小时/>这会产生

        0             1      2               3
0 864982 JA-PAREN 4.25* 11/01 01:00:00
1 934821 None 4.00 11/01 01:00:00
2 620021 I-MAS DIN 5.25* 11/01 01:00:00
3 969722 MS-DARE AUT .35 11/01 01:00:00
4 523421 F-INV PROC None 11/01 01:00:00
5 634312 MA-BAREAUTH None 11/01 01:00:00
6 523421 MK-PERM YEAR None 11/01 01:00:00
7 123512 G5-FSB 3.00 11/01 01:00:00

关于Python:混合场景正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47849467/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com