使用Python和正则表达式去除制表符分隔文件中特定的尾部和结束字符
我已经很多年没用过正则表达式了,所以想请教一下这里的专家,因为这可能是个简单的事情 :)
我有一个用制表符分隔的文件,每一行都有一些字段,里面的值像这样:
- foo
- bar
- b"foo's bar"
- b'bar foo'
- b'carbar'
(文件中的一整行可能是这样的:
123\t b'bar foo' \tabc\t123\r\n
我想去掉每一行中那个字段前面的 b' 和 b" 以及后面的 " 和 '。所以根据上面的例子,运行正则表达式后,我希望得到:
123\t bar foo \tabc\t123\r\n
如果你能给我一段 Python 代码来处理这个文件,那就更好了。
3 个回答
0
在编程的世界里,有时候我们会遇到一些问题或者错误,这些问题可能会让我们感到困惑。比如,当你在写代码的时候,可能会发现程序没有按照你预期的方式运行。这种情况就需要我们去查找原因,看看哪里出了问题。
有些时候,错误信息会给我们一些提示,告诉我们是哪个部分出错了。比如,可能会提示某个变量没有定义,或者某个函数没有正确调用。这些信息就像是程序在跟我们说:“嘿,我在这里遇到了麻烦,你能帮我看看吗?”
解决这些问题的过程就像是侦探破案,我们需要仔细观察代码,找到线索,逐步排除错误。通过调试工具,我们可以一步一步地运行代码,看看每一步的结果,这样就能更清楚地了解程序的运行情况。
总之,编程就像是解谜游戏,遇到问题时不要慌张,慢慢分析,找到解决方案,你会发现编程其实很有趣!
>>> "b\"foo's bar\"".replace('b"',"").replace("b'","").rstrip("\"'")
"foo's bar"
>>> "b'bar foo'".replace('b"',"").replace("b'","").rstrip("\"'")
'bar foo'
>>>
1
(^|\t)b[\"'] 这个表达式是用来匹配字符串开头的部分,前面可以是行的开始或者一个制表符(也就是Tab键)。
而对于结尾部分:
\"' 这个表达式可以用来匹配字符串的结尾。
在Python中,你可以这样写:
import re
r1 = re.compile("(^|\t)b[\"']")
r2 = re.compile("[\"'](\t|$)")
然后你只需要使用:
r1.sub("\\1", yourString)
r2.sub("\\1", yourString)
1
对于每一行,你可以使用
re.sub(r'''(?<![^\t\n])\W*b(["'])(.*)\1\W*(?![^\t\n])''', r'\2', line)
如果想要额外的奖励:
import re
pattern = re.compile(r'''(?<![^\t\n])\W*b(["'])(.*?)\1\W*?(?![^\t\n])''')
with open('outfile', 'w') as outfile:
for line in open('infile'):
outfile.write(pattern.sub(r'\2', line))