有没有一种方法可以替换字符串中成对字符之外的所有空格?

3

我有一个日志文件,需要将其转换为csv格式。为此,我需要使用|字符替换所有空格。

到目前为止,我的代码如下:

with open('Log_jeden_den.log', 'r') as f:
for line in f:
    line = re.sub(r'[ ]+(?![^[]*\])', '|', line)

这个文件的一个例子如下所示:
123.456.789.10 - - [20/Feb/2020:06:25:16 +0100] "GET /android-icon-192x192.png HTTP/1.1" 200 4026 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"

如您所见,[]"" 中间有空格。我不想替换他们内部的空格,只想替换外部的。

我可以使用此正则表达式[ ]+(?![^[]*\])来处理[],但是如果我使用类似的正则表达式[ ]+(?![^"]*\")来处理"",它不起作用。我尝试了多个变体,但都没有起作用。我错过了什么吗?

如果我解决这个问题,那么我还需要结合这些正则表达式,以便我只替换这两个字符对之外的空格。这将是我的第二个问题。

编辑:如要求的示例行的输出:

123.456.789.10|-|-|[20/Feb/2020:06:25:16 +0100]|"GET|/android-icon-192x192.png|HTTP/1.1"|200|4026|"-"|"Mozilla/5.0|(Windows|NT|6.1;|WOW64;|Trident/7.0;|rv:11.0)|like|Gecko"

编辑2:这将是我期望的输出结果:

123.456.789.10|-|-|[20/Feb/2020:06:25:16 +0100]|"GET /android-icon-192x192.png HTTP/1.1"|200|4026|"-"|"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"

你能否编辑你的帖子并提供一个例子输出来展示你的代码行? - Lucan
文件中的所有行是否与示例显示的结构类似?即它们是否都包含第一部分、方括号内的第二部分和双引号内的第三部分? - jmd_dk
@Lucan,我已根据你的要求编辑了帖子。 - XuBo
@jmd_dk 是的。文件的所有行都具有完全相同的结构。 - XuBo
1个回答

2

您可以使用

with open('Log_jeden_den_out.log', 'w') as fw:
    with open('Log_jeden_den.log', 'r') as fr:
        for line in fr:
            fw.write( re.sub(r'(\[[^][]*]|"[^"]*")|\s', lambda x: x.group(1) if x.group(1) else "|", line) )

细节

  • (\[[^][]*]|"[^"]*") - 匹配并捕获最接近的 []"" 之间的任何子字符串到第一组中。
  • | - 或者
  • \s - 在其他上下文中仅匹配任何空白字符

lambda x: x.group(1) if x.group(1) else "|" 替换将 Group 1 放回如果它有匹配,否则用管道符号替换。


1
这太棒了!恰好是我所需的。谢谢你。 - XuBo
1
我已经给你的答案点赞了,现在我的声望超过了15分。再次感谢你的帮助和额外提供的信息。 - XuBo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接