当前位置: 首页 > 知识库问答 >
问题:

将文本文件中的重复分隔符替换为备用字符

澹台昆
2023-03-14

我试图处理一个以“|”分隔的、双引号限定的大管道文本文件(

一个简单的例子是:

"abc"|"2016-07-30"|"text narrative field"|"2016-08-01"|"123"|"456"|"789"|"EOR"

一个更具代表性的例子是:

"abc"|"2017-01-01"|"height: 5' 7" (~180 cm) | weight: 80kg | in good health"|"2016-01-10"||||"EOR"

我一直在尝试编写一个正则表达式,它将替换每个管道字符/双引号组合或紧接在前面和后面的管道字符序列,并用TAB字符替换双引号1对1。我发现了许多用单个字符替换重复字符串的正则表达式示例,但没有一个用等长的备用字符字符串替换一系列重复字符的示例。

我尝试了以下正则表达式:"\|{1,}"它适用于单个管道字符,但用单个TAB依次替换多个管道。我还需要处理以下相关方面:

  • 删除行首/双引号(^”)
  • 删除双引号/行尾($)
  • 并将双引号/管道(1个或更多)/行尾(例如“\|$)替换为与管道字符数量相同的制表符

应用正则表达式后的输出记录将如下所示,使用\t表示TAB字符:

abc\t2016-07-30\ttext narrative field\t2016-08-01\t123\t456\t789\tEOR
abc\t2017-01-01\theight: 5' 7" (~180 cm) | weight: 80kg | in good health\t2016-01-10\t\t\t\tEOR

我愿意在python或linux中使用sed或awk解决这个问题

共有3个答案

裴昕
2023-03-14

你可以在三次传球中完成。

  1. 将所有| |替换为|“|
  2. 在两端分开
  3. 删除每个字段中的引号

详情如下:

import re

for line in file:
    while '||' in line:
        line = line.replace('||', '|""|')

    fields = re.split('^\||\|$|"\|"', line)

    new_line = '\t'.join([field.strip('"') for field in fields])
司徒杜吟
2023-03-14

既然你在寻找“|”不是用|替换多个|的答案吗?

怎么样:

while True:
    new_data = re.sub(r'\|\|', '|""|', data)
    if data == new_data:
        break
    data = new_data

在此之后,您可以用制表符替换“|”

闾丘永春
2023-03-14
import re

def count_pipes_in_regex_match(m):
  #  regex capture group should only contain pipe chars
  matched_pipes = m.groups()[0]

  return '\t' * len(matched_pipes)


# test string
s='"abc"|"2017-01-01"|"height: 5\' 7" (~180 cm) | weight: 80kg | in good health"|"2016-01-10"||||"EOR"'


# replace leading or trailing quotes
s = re.sub('^"|"$', '', s)

# replace quote pipe(s) quote 
# or      quote pipe(s) end-of-string
# with as many tabs as there were pipes
s = re.sub('"(\|+)("|$)', count_pipes_in_regex_match, s)

print repr(s) #repr to show the tabs

在repl.it在线尝试

 类似资料:
  • 我已经找到了几个有类似问题和有价值答案的主题,但我仍然在纠结这个: 我想用Jsoup解析一些html,这样我就可以替换,例如, 与 ,但仅当它出现在html的文本部分时,如果它是标签的一部分,则不会。所以,从这个html开始: 我想说的是: 我尝试了几种方法,这种方法使我更接近预期的结果: 但使用这种方法,我发现了两个问题: > 换行符在我引入的新元素之前和之后插入。这不是一个真正的问题,因为如果

  • 问题内容: 我需要打开一个文本文件并替换一个字符串。我需要这个 到目前为止,这是我所拥有的,但是除了多余的空格外,我看不到文本文件中的任何更改。 我该怎么做? 问题答案: 这项工作:

  • 问题内容: 我是shell脚本的新手,并且对如何使用字符串或其他工具替换文本文件中的第一行感到困惑。这是文本文件的内容: 我想将第一行(电影文件路径)替换为just (可能是shell脚本中的变量) 请指导我如何执行此操作。我遇到了一些帖子,我需要在这里使用吗? 问题答案: sed是正确的工具,请尝试执行以下操作: 说明 平均第一行 剩下的就是替换:我们用变量替换所有(。*)

  • 问题内容: 我有一个名为log.txt的文本文件,它具有以下数据 第一个逗号之前的数字是指定每个项目的索引。 我想做的是读取文件,然后将给定行中字符串的一部分(例如textFiles / a.txt)替换为另一值(例如something / bob.txt)。 这就是我到目前为止 问题答案: 一种方法是使用: 您还可以使用正则表达式,或查找搜索字符串在一行中的何处。

  • 主要目标是用hashmap中的值替换字符串中的一些单词作为关键字(关键字是文本中的单词)。钥匙的格式不同。例如:主文本:“Lookahead和Lookahead,统称为Lookahead,是[0-23]断言”hashmap:{Lookahead=test1,Lookahead=test2,Lookahead=test3,[0-23]=newvalue}预期输出:“test1和test2,统称为te

  • 问题内容: 我正在寻找一种替换文件中的字符串而不将整个文件读入内存的方法。通常我会使用Reader和Writer,例如以下内容: 但是,我想就地进行替换,并且不认为可以同时在同一文件上打开Reader和Writer。另外,我正在使用Java 1.4,因此无法访问NIO,扫描仪等。 谢谢唐 问题答案: 通常无法对文件进行“就地”替换,除非替换的长度与原始长度完全相同。否则,文件将需要增大,从而将所有