我有一个CSV文件,其中管道用作分隔符. 但有时,第三个管道后面会有一个短子字符串:它后面最多有两个字母数字字符.则不应将第三个竖线解释为分隔符.

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

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

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

示例:如果管道3和4之间的字符少于3个,则在所有管道上拆分,第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"放在一起.

我的正则表达式try 只用于这样的子字符串替换:如果它发现竖线在两位数之间:3|4=>3-4,则用连字符替换竖线.

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

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

推荐答案

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

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相关问答推荐

当pip为学校作业(job)安装sourcefender时,我没有收到匹配的分发错误.我已经try 过Python 3.8.10和3.10.11

如何在telegram 机器人中发送音频?

已删除的构造函数调用另一个构造函数

在Python中管理多个OpenGVBO和VAO实例

symy.分段使用numpy数组

剧作家Python:expect(locator).to_be_visible()vs locator.wait_for()

如何计算列表列行之间的公共元素

如何在BeautifulSoup中链接Find()方法并处理无?

通过优化空间在Python中的饼图中添加标签

Pandas 第二小值有条件

如何使用symy打印方程?

Polars LazyFrame在收集后未返回指定的模式顺序

难以在Manim中正确定位对象

需要计算60,000个坐标之间的距离

未删除映射表的行

Plotly Dash Creating Interactive Graph下拉列表

Pandas Data Wrangling/Dataframe Assignment

在Python中使用yaml渲染(多行字符串)

如何获取Python synsets列表的第一个内容?

如何在Great Table中处理inf和nans