我有一个类似CSV的文本文件,大约有1000行。文件中的每个记录之间是一长串破折号。记录通常以\ n结尾,但有时在记录结束前有一个额外的\ n。简化示例:
"1x", "1y", "Hi there"
-------------------------------
"2x", "2y", "Hello - I'm lost"
-------------------------------
"3x", "3y", "How ya
doing?"
-------------------------------
我想用空格替换额外的\ n,即连接短划线之间的线。我以为我能做到这一点(Python 2.5):
text = open("thefile.txt", "r").read()
better_text = re.sub(r'\n(?!\-)', ' ', text)
但这似乎取代了每一个\ n,而不仅仅是那些没有后跟破折号的那些。我做错了什么?
我在问这个问题,试图提高自己的正则表达能力并理解我所犯的错误。最终目标是生成一个格式的文本文件,该格式可由特定的VBA for Word宏使用,该宏生成一个样式化的Word文档,然后由Word友好的CMS消化。
答案 0 :(得分:7)
这是一个使用生成器函数跳过----
行并产生csv模块可以读取的内容的好地方。
def readCleanLines( someFile ):
for line in someFile:
if line.strip() == len(line.strip())*'-':
continue
yield line
reader= csv.reader( readCleanLines( someFile ) )
for row in reader:
print row
这应该无缝且无声地处理引号内的换行符。
如果您想对此文件执行其他操作,例如,保存已删除----
行的副本,则可以执行此操作。
with open( "source", "r" ) as someFile:
with open( "destination", "w" ) as anotherFile:
for line in readCleanLines( someFile ):
anotherFile.write( line )
这将删除----
行的副本。这并不值得付出努力,因为读取和跳过这些行非常非常快,并且不需要任何额外的存储空间。
答案 1 :(得分:5)
答案 2 :(得分:1)
re.sub(r'(?<!-)\n(?!-)', ' ', text)
(连字符不需要在字符类之外转义。)
答案 3 :(得分:0)
RegEx并不总是最适合这项工作的工具。如何先通过“Split”或“Tokenize”这样的方式运行它? (我确定python有一个等价的)然后你有你的记录,并且可以假设换行只是延续。