gpt4 book ai didi

python - 正则表达式拆分 : ignore delimiter if followed by short substring

转载 作者:行者123 更新时间:2023-12-05 03:18:53 26 4
gpt4 key购买 nike

我有一个 csv 文件,其中管道作为分隔符。但有时第三个管道后面有一个短子字符串:它后面最多有 2 个字母数字字符。那么第三个管道不应被解释为分隔符。

示例:在每个管道上拆分:

x1 = "as234-HJ123-HG|dfdf KHT werg|XXL|s45dtgIKU|2017-SS0|123.45|asUJY"

=> 在 XXL 之后拆分,因为它后面跟了超过 2 个字符

示例:如果管道 3 和管道 4 之间的字符少于 3 个,则在除第三管道之外的所有管道上拆分:

x2 = "as234-H344423-dfX|dfer XXYUyu werg|1g|z4|sweDSgIKU|2017-SS0|123.45|YTf"

x3 = "as234-H3wer23-dZ|df3r Xa12yu wg|a1|2|sweDSgIKU|2017-SS0|123.45|YTf"

=> 将“1g|z4”和“a1|2”放在一起。

我的正则表达式尝试只满足像这样的子字符串替换:如果它在 2 位数字之间找到它,它将用连字符替换管道:3|4 => 3-4。

x = re.sub(r'(?<=\d)\|(?=\d)', repl='-', string=x1, count=1).

我的问题是:如果在第三个竖线之后跟随一个字母数字子串,不超过 1 或 2 个字符(如 Bx、2、42、z 或 3b),则 re.split 应该忽略第三个竖线并继续第四管。除了 #3 之外的所有其他竖线都是无条件分隔符。

最佳答案

您可以使用 re.sub 在短列周围添加 quotechar。然后使用 Python 的内置 csv 模块来解析文本(使用表达式的 regex101)

import re
import csv
from io import StringIO

txt = """\
as234-HJ123-HG|dfdf KHT werg|XXL|s45dtgIKU|2017-SS0|123.45|asUJY
as234-H344423-dfX|dfer XXYUyu werg|1g|z4|sweDSgIKU|2017-SS0|123.45|YTf
as234-H3wer23-dZ|df3r Xa12yu wg|a1|2|sweDSgIKU|2017-SS0|123.45|YTf"""


pat = re.compile(r"^((?:[^|]+\|){2})([^|]+\|[^|]{,2}(?=\|))", flags=re.M)
txt = pat.sub(r'\1"\2"', txt)

reader = csv.reader(StringIO(txt), delimiter="|", quotechar='"')
for line in reader:
print(line)

打印:

['as234-HJ123-HG', 'dfdf KHT werg', 'XXL', 's45dtgIKU', '2017-SS0', '123.45', 'asUJY']
['as234-H344423-dfX', 'dfer XXYUyu werg', '1g|z4', 'sweDSgIKU', '2017-SS0', '123.45', 'YTf']
['as234-H3wer23-dZ', 'df3r Xa12yu wg', 'a1|2', 'sweDSgIKU', '2017-SS0', '123.45', 'YTf']

关于python - 正则表达式拆分 : ignore delimiter if followed by short substring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73595763/

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