2 回答
TA贡献1826条经验 获得超6个赞
这对你有用吗?它给了我想要的输出。
re.sub(r'(\|.*\|.*\|.*)(\|.*\|.*\|\|\n)',r'\g<1>'+'|'+r'\g<2>',DATA)
我在第 1 组中保留了 506 之前的所有内容,在第 2 组中保留了 506 之后的所有内容,并添加了一个“|” 介于两者之间。
TA贡献1847条经验 获得超7个赞
您的正则表达式存在一些问题。星号*表示前一个元素(无论是一个字符还是复合词)可以重复零次或多次。因此,\|*将匹配“”(空字符串)、“|”、“||”等,\|*\|*\|\|并将匹配两个连续的条“||” 前面有任意数量的小节(0 或更多)——因此,它只匹配最后两个小节。
为了证明这一点,re.sub你可以用一些不同的字符包围反向引用(即\1)(我使用了花括号,即{\1}下面)。
data="""| 24 | 11 | 506 | -1 | -829.99||
| 24 | 11 | 1910 | 506 | 1 | 829.99|3|
| 12 | 11 | 1933 | 531 | 2 | 7.78 |N|
"""
print("using regex above, with curly braces around captured match:")
print(re.sub(r'(\|*\|*\|\|)', r'{\1}', data))
print("desired output:")
print(re.sub(r'(\|[^|]+\|[^|]+\|[^|]+\|\|)', r'|\1', data))
输出:
using regex above, with curly braces around captured match:
| 24 | 11 | 506 | -1 | -829.99{||}
| 24 | 11 | 1910 | 506 | 1 | 829.99|3|
| 12 | 11 | 1933 | 531 | 2 | 7.78 |N|
desired output:
| 24 | 11 || 506 | -1 | -829.99||
| 24 | 11 | 1910 | 506 | 1 | 829.99|3|
| 12 | 11 | 1933 | 531 | 2 | 7.78 |N|
该解决方案查找它们之间具有正数项目的条形,这些条形不是条形。[^|]表示除|将匹配之外的任何内容。请注意,在括号中,该栏不需要转义。表示“+一个或多个前一个元素”。
添加回答
举报
