在Python3.x中替换字符串中的转义序列字符

在Python3.x中替换字符串中的转义序列字符,python,regex,replace,Python,Regex,Replace,我使用以下代码替换字符串中的转义字符。我首先使用\n和使用的re.sub()进行了拆分,但我仍然不知道我缺少了什么,代码没有按照预期工作。我是Python的新手,所以请不要判断是否存在优化问题。这是我的代码: #import sys import re String = "1\r\r\t\r\n2\r\r\n3\r\r\r\r\n\r\n\r4\n\r" splitString = String.split('\n') replacedStrings = [] i=0 for oneStri

我使用以下代码替换字符串中的转义字符。我首先使用
\n
和使用的
re.sub()
进行了拆分,但我仍然不知道我缺少了什么,代码没有按照预期工作。我是Python的新手,所以请不要判断是否存在优化问题。这是我的代码

#import sys
import re

String = "1\r\r\t\r\n2\r\r\n3\r\r\r\r\n\r\n\r4\n\r"
splitString = String.split('\n')
replacedStrings = []
i=0

for oneString in splitString:
    #oneString = oneString.replace(r'^(.?)*(\\[^n])+(.?)*$', "")
    oneString = re.sub(r'^(.?)*(\\[^n])+(.?)*$', "", oneString)
    print(oneString)
    replacedStrings.insert(i, oneString)

    i += 1

print(replacedStrings)
我的目标是:我只需要值(不需要转义序列)作为分割字符串

我的方法是:

  • 我将字符串拆分为
    \n
    ,这将为我提供单独字符串的数组列表
  • 然后,我使用正则表达式检查了每个字符串,如果正则表达式匹配,那么匹配的子字符串将替换为“”
  • 然后我将这些字符串推送到一个集合中,认为它会将替换的字符串存储在新的数组列表中
  • 所以基本上,我已经完成了1和2,但现在我被困在3。以下是我的输出:

    1
    2
    3
    
    4
    
    ['1\r\r\t\r', '2\r\r', '3\r\r\r\r', '\r', '\r4', '\r']
    

    您可能会发现在这里使用简单的模式
    \S+
    更容易使用
    re.findall

    input = "1\r\r\t\r\n2\r\r\n3\r\r\r\r\n\r\n\r4\n\r"
    output = re.findall(r'\S+', input)
    print(output)
    
    ['1', '2', '3', '4']
    
    这种方法将隔离和匹配一个或多个非空白字符的孤岛

    编辑:

    根据您的新输入数据,我们可以尝试匹配模式
    [^\r\n\t]+

    input = "jkahdjkah \r\r\t\r\nA: B\r\r\nA : B\r\r\r\r\n\r\n\r4\n\r"
    output = re.findall(r'[^\r\n\t]+', input)
    print(output)
    
    ['jkahdjkah ', 'A: B', 'A : B', '4']
    

    re.sub
    并不是这里工作的合适工具。表格上的内容是
    split
    re.findall
    ,因为您希望重复匹配/隔离文本的某一部分
    re.sub
    用于获取字符串并将其转换为其他内容。它可以用来提取文本,但对于多个匹配项来说效果不太好。

    您就快到了,我将使用
    string.strip()
    替换字符串开头和结尾的多个
    \r
    \n

    String = "1\r\r\t\r\n2\r\r\n3\r\r\r\r\n\r\n\r4\n\r"
    splitString = String.split('\n')
    replacedStrings = []
    i=0
    
    for oneString in splitString:
        s = oneString.strip()
        if s != '':
            print(s)
            replacedStrings.append(s)
    
    print(replacedStrings)
    
    输出将如下所示

    1
    2
    3
    4
    ['1', '2', '3', '4']
    

    对于
    “jkahdjkah\r\r\t\r\nA:B\r\r\nA:B\r\r\n\r\n\r\4\n\r”
    ,输出将是
    ['jkahdjkah',A:B',A:B',4']
    我又找到了一种方法,这似乎很好,它可能没有其他答案那么优化,但这只是另一种方式:

    import re
    splitString = []
    String = "jhgdf\r\r\t\r\nA  : B\r\r\nA  : B\r\r\r\r\n\r\n\rA: B\n\r"
    splitString = re.compile('[\r\t\n]+').split(String)
    if "" in splitString:
      splitString.remove("")
    print(splitString)
    
    我在这里添加了它,以便与我一样经历同样麻烦的人可能也希望忽略这种方法

    以下是我使用上述代码后得到的输出:

    ['jhgdf', 'A  : B', 'A  : B', 'A: B']
    

    这对于This input
    “jkahdjkah\r\t\r\nA:B\r\r\nA:B\r\r\n\r\n\r\n\r”
    ,其中输出应该给我
    ['jkahdjkah','A:B','A:B',4]
    ,而输出是
    ['jkahdjkah','A:','B','A','A','A','A','A','B','A','A','B','4']
    @code\u然后匹配
    ,问:我的最新答案。这真的很酷,但我的疑问仍然存在,
    re.sub()
    ,这有什么问题,为什么不起作用,请您在回答中对此添加一些解释?我有一个问题,您的代码工作得很好,但为什么
    re.sub
    不起作用?可能是因为替换字符串不正确!在国际海事组织,更换是不必要的
    strip
    做了你需要的一切。那么,我能用什么替代字符串来让代码工作呢?@code\u Ninja:我只是想解释一下为什么你的
    sub
    不能像你期望的那样工作。在执行
    sub
    时,您在正则表达式中使用了start
    ^
    和end
    $
    锚点,如果匹配,则将匹配整个字符串,然后整个字符串将被替换为空字符串,这不是您想要的。相反,您应该使用
    oneString=re.sub(r'[\r\t]+','',oneString)
    来正确替换字符串中的所有
    \r
    \t
    ,并为您提供正确的输出。虽然我不完全理解您的regexp试图实现的目标,我看到一个主要缺陷:您试图逐字匹配
    `而
    String`不包含任何内容。
    字符串中的
    `in`仅用于转义,它们不在那里!哎呀。注释格式问题<代码>\`while
    String
    。。。
    字符串中的
    \`。。。也不行吗?如何在代码引用中加反斜杠。。。字符串中的反斜杠…字符串中的反斜杠…@mkiever不知道,我两种方法都试过了,这似乎是SO可能想解决的问题。