我已使用以下代码替换字符串中的转义字符。我首先完成了用\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']
答案 0 :(得分:3)
在这里,您可能会发现使用re.findall
和简单模式\S+
会更容易:
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
对于获取字符串并将其转换为其他字符串很有用。 可以用于提取文本,但在多个匹配项中效果不佳。
答案 1 :(得分:2)
您快到了,我只需要使用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\r\r\n\r\n\r4\n\r"
,输出将为['jkahdjkah', 'A: B', 'A : B', '4']
答案 2 :(得分:0)
我发现了另一种方法,它似乎可以正常工作,它可能没有其他答案那样优化,但这只是另一种方法:
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']