【问题标题】:Python parsing stringPython解析字符串
【发布时间】:2016-03-02 02:49:59
【问题描述】:

有人可以帮我用 Python 解决这个问题吗,我有一个看起来像这样的字符串:

Comm IF Ver 1.18c Port  TCP-1
>R5281H0000
>L0121 @g
>E0042A1204C0000
>S@QT@L0121 @g
>S0339E1512
>

我想从该输出中获取如下所示的字符串:

R5281H0000   L0121 @g   E0042A1204C0000   S@QT@L0121 @g   S0339E1512

【问题讨论】:

  • 这是来自文件吗?还是多行的字符串?
  • 是一个6行的字符串,所以string.count('\n')的结果是6。
  • 这很奇怪,因为我看到了 7 行?
  • 对于 7 行的字符串,可以有 6 个 \n。最后一行没有\n :) 看到了吗?

标签: python string parsing


【解决方案1】:

假设这是string

a = " \
    Comm IF Ver 1.18c Port  TCP- \
    >R5281H0000 \
    >L0121 @g \
    >E0042A1204C0000 \
    >S@QT@L0121 @g \
    >S0339E1512 \
    >"

考虑使用split 来获取结果

b = a.split('>')[1:-1] #1 is to exclude the first one, -1 to exclude the last one

生成包含所需元素的列表。

如果您想将它们组合成带有一些空格的string,请使用join

c = " ".join(b) 

编辑分步说明:

split 会根据其分隔符将您的字符串“拆分”为substrings。在这种情况下,分隔符为>,因此它会更改一个长字符串:

a = " \
    Comm IF Ver 1.18c Port  TCP- \
    >R5281H0000 \
    >L0121 @g \
    >E0042A1204C0000 \
    >S@QT@L0121 @g \
    >S0339E1512 \
    >"

进入具有以下元素的字符串列表:

'Comm IF Ver 1.18c Port  TCP-' #element no 0
'R5281H0000' #no 1
'L0121 @g' #no 2
'E0042A1204C0000' #no 3
'S@QT@L0121 @g' #no 4
'S0339E1512' #no 5
'' #no 6

然后当你使用切片索引[1:-1]时,你将第一个和最后一个元素截断:

'below is b

'R5281H0000' #no 0, previously 1
'L0121 @g' #no 1, previously 2
'E0042A1204C0000' #no 2, previously 3
'S@QT@L0121 @g' #no 3, previously 4
'S0339E1512' #no 4, previously 5

最后,join 会将列表中的这些字符串重新组合成一个用空格分隔的字符串" "

R5281H0000      L0121 @g      E0042A1204C0000      S@QT@L0121 @g      S0339E1512    

【讨论】:

  • 您能否向我解释一下 b = a.split('>')[1:-1] 的工作原理,它正在做我想做的事情,但只是想看看它是如何做的是吗?
  • @Dominik 解释道。希望它能让你更好地理解。 :)
  • 每行末尾还有新行吗? \r\n
  • @Dominik 如果你 join withspace " " 那么你就没有它了。如果你 join\r\n,那么它将拥有它。这取决于你如何 join them. In my case, I join` 和 " ",因此新行已经消失。
  • 为了去掉换行符c = (" " *3).join([s.strip() for s in b])(对不起" "*3,我无法在一个字符串中显示三个空格)。
【解决方案2】:

我收集到的是,您希望以三个空格加入以> 开头的每一行,但不要包括>。以下是如何做到这一点:

print("   ".join(s.lstrip(">") for s in string if s.startswith(">")))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2021-10-29
    • 2016-06-29
    • 2011-06-20
    相关资源
    最近更新 更多