我有一个类似CSV的文本文件,大约有1000行.文件中的每个记录之间是一长串破折号.记录通常以\n结尾,但有时在记录结束前有一个额外的\n.简化示例:
"1x", "1y", "Hi there"
-------------------------------
"2x", "2y", "Hello - I'm lost"
-------------------------------
"3x", "3y", "How ya
doing?"
-------------------------------
Run Code Online (Sandbox Code Playgroud)
我想用空格替换额外的\n,即连接破折号之间的线.我以为我能做到这一点(Python 2.5):
text = open("thefile.txt", "r").read()
better_text = re.sub(r'\n(?!\-)', ' ', text)
Run Code Online (Sandbox Code Playgroud)
但这似乎取代了每一个\n,而不仅仅是那些没有紧随其后的那些.我究竟做错了什么?
我问这个问题是为了提高我自己的正则表达能力并理解我犯的错误.最终目标是生成一种格式的文本文件,该格式可由特定的VBA for Word宏使用,该格式生成一个样式化的Word文档,然后由Word友好的CMS消化.
这是一个使用生成器函数来跳过行----和生成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
Run Code Online (Sandbox Code Playgroud)
这应该无缝且无声地处理引号内的换行符.
如果要对此文件执行其他操作,例如,保存----删除了行的副本,则可以执行此操作.
with open( "source", "r" ) as someFile:
with open( "destination", "w" ) as anotherFile:
for line in readCleanLines( someFile ):
anotherFile.write( line )
Run Code Online (Sandbox Code Playgroud)
这将----删除行的副本.这并不值得付出努力,因为阅读和跳过这些行非常非常快,并且不需要任何额外的存储空间.
您需要排除分隔线末尾的换行符.试试这个:
\n(?<!-\n)(?!-)
Run Code Online (Sandbox Code Playgroud)
这个正则表达式使用负面的后置断言来排除\n前面的一个断言-.
| 归档时间: |
|
| 查看次数: |
965 次 |
| 最近记录: |