【问题标题】:What would be a good way to deal with backslash escaped characters?处理反斜杠转义字符的好方法是什么?
【发布时间】:2023-04-08 22:54:01
【问题描述】:

我有一个格式如下的字符串;

s="part1,part2,part3,part4"

我可以通过调用s.split(",") 命令将字符串分割成片段。

现在,问题是如果字符串中有反斜杠转义逗号怎么办?假设我有以下字符串,

s="part1,part2,pa\\,rt3,part4"

我希望能够得到["part1","part2","pa,rt3","part4"] 作为结果。

我最初的想法是将\,替换为不存在的字符串,然后使用split命令拆分字符串,并将不存在的字符串替换为逗号。

你能想出更好的方法来解决这个问题吗?

【问题讨论】:

  • 这看起来像是 Regex 的问题,尽管您现在可能有两个问题。
  • 你还需要处理反斜杠转义的反斜杠吗?
  • @dan04:只有逗号没问题。因为那是零件的分界线。但是,如果某个部分以反斜杠结尾,则可能会导致在此特定情况下可以接受的问题。所以不需要处理反斜杠转义的反斜杠。

标签: python string escaping


【解决方案1】:

用不存在的字符串替换它是一个不错的选择。

否则,您可以使用带有否定后视的正则表达式,如下所示:

re.split(r'(?<!\\),', 'part1,part2,pa\\,rt3,part4')

【讨论】:

  • 所以这个正则表达式说:回头看,如果没有 \ 字符,则拆分。这正是我正在寻找的!谢谢。
  • @funktku:完全正确。在大多数正则表达式实现中,您都有否定和肯定的后向和前瞻断言。肯定的版本显然需要字符串可用,而否定的版本接受除该字符串之外的所有内容。
  • 否定后向断言(?&lt;!...) 的好例子。谢谢你的知识。
【解决方案2】:

csv 模块也可以处理这个问题:

import csv
from io import StringIO

s = 'part1,part2,pa\\,rt3,part4'
f = StringIO(s)

r = csv.reader(f,quoting=csv.QUOTE_NONE,escapechar='\\')
for row in r:
    print row

输出

['part1', 'part2', 'pa,rt3', 'part4']

【讨论】:

    【解决方案3】:

    顺便说一句,'\' 是 not an escape character 表示 ',' 逗号。所以你的字符串会有一个带“\”的合法词。如果您特别希望 \, 成为单词的一部分,那么基于正则表达式的解决方案对我来说看起来不错。

    【讨论】:

    • 你错了。您链接到的页面甚至给出了以下语法: escapeseq ::= "\" '\,' 确实不是对 Python 字符串格式有意义的转义序列,但这不是 OP 的一部分问题。对于 CSV,当逗号也是字段分隔符时,请使用反斜杠转义逗号。
    猜你喜欢
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 2020-10-11
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多