[英]Conditional Search and Replace in a file Python
需要条件搜索和替换时,我有一个超过10MB的大型文本文件。 如果“ a”之后的字符是“ r”或“ m”或“ n”或“ u”,我想用“ā”替换文件中“ a”的每个实例。
例如:输入文件
Hamro sano ghar holata.
输出文件
Hāmro sāno ghār holata.
编辑
谢谢大家,它似乎运作良好。 但这似乎不适用于非拉丁字符,例如印度脚本:拉丁字符的工作脚本:
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import re
input = "Hamro sano ghar holata."
regex = re.compile(ur'a([rmnu])')
print regex.sub(ur'ā\1', input)
脚本1(用于梵文)不起作用
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import re
input ="संगम"
regex = re.compile(ur'ं([कखगघ])')
print regex.sub(r'ङ्\1', input)
Script2(添加了unicode的东西)不起作用
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import re
input =u"संगम"
regex = re.compile(ur'ं([कखगघ])', re.UNICODE)
print regex.sub(r'ङ्\1', input)
预期输出:ं替换为ङ्,因为ग跟随ं即सङ्गम
您需要在此处输入一个简单的正则表达式。 像这样吗
>>> import re
>>> input = "Hamro sano ghar holata."
>>> regex = re.compile(ur'a([rmnu])') # the part in parens is remembered
>>> print regex.sub(ur'ā\1', input) # replace by ā plus remembered part
Hāmro sāno ghār holata.
编辑:
一些背景,首先:
这是梵文一个更艰巨的任务(देवनागरी),并不是因为编码的,但因为结合的字形规则是非常复杂的(至少,由拉丁字母的标准)。 例如,我在Chrome上写了这个答案,但仍然无法正确将Devanāgarī改成 “Devanāgarī”(它在错误的位置得到了'e'的变音符号-与dipthong'ai的用法相同')。
这些字形由文本渲染引擎组合的方式称为“连字”,对于Devanāgarī ,从技术角度来看,它们非常复杂。 如果添加的संधि(saṃdhi -再次,Chrome的渲染变得代表放错了地方的随韵的宾度 )推出的进一步巨大的并发症,那么你就可以看到你想在这里做可以迅速得到极其困难的。
综上所述,如果您的问题仅限于这种简单情况,那么我认为可以完全解决。
>>> import re
>>> inputString = u"संगम"
>>> regex = re.compile(ur'\u0902(?=[कखगघ])')
>>> print regex.sub(ur'ङ\u094d', inputString)
सङ्गम
在正则表达式中,为清楚起见,我用unicode转义值替换了anusvāra和virāma (印地语: halant )。 考虑到连字的工作方式,可能会遗漏某些情况,但是我已将示例转换为使用先行方式,如@Kabie的示例(无论如何,这可能是一个更好的选择),以尽可能地减轻这种情况。
re.sub(r'a(?=[rmnu])',r'ā',"Hamro sano ghar holata.")
对于较大的文本文件,应复制原始文件,替换字符,然后使用更新的行编写新文件。 您一次只能读取一个块,而不是整个文件。 (尽管在一台现代计算机上,您可以一次吞噬整个10 MB。)
一种简单的方法是将文件对象用作迭代器。 这一次从文件返回一行。
import re
pat = re.compile(ur'a([rmnu])') # pre-compile regex pattern for speed
f = open("corrected_file.txt", "wb")
for line in open("big_file_10mb.txt", "rb"):
line = pat.sub(ur'ā\1', line)
f.write(line)
f.close()
如果您想一次性处理整个文件,则可以使用.read()
方法函数:
f = open("big_file_10mb.txt", "rb")
s = f.read() # read entire file contents
f.close()
s = pat.sub(ur'ā\1', s) # replace over entire file contents
f = open("corrected_file.txt", "wb")
f.write(s) # write entire file contents
f.close(s)
除非您有充分的理由,否则请不要这样做。 面向行的版本易于理解,并且与计算机上可用的内存相比,当文件较大时,效果更好。
Dive Into Python一书中有一章介绍了正则表达式:
http://diveintopython3.ep.io/regular-expressions.html
您要阅读Unicode并替换Unicode字符。 您将需要弄清楚文件的本机编码,将其读入,转换为Unicode,进行替换,然后以正确的编码写出。 或者,您可以使用特殊的“编解码器”模块; codecs.open()将为您提供一个自动为您转换的文件对象。
这是Python的Unicode“操作方法”文档:
http://docs.python.org/howto/unicode.html
因此,假设您要读取的文本文件是使用UTF-8编码的。 我认为这将为您工作:
import codecs
import re
pat = re.compile(ur'a([rmnu])') # pre-compile regex pattern for speed
f = codecs.open("corrected_file.txt", mode="wb", encoding="utf-8")
for line in codecs.open("big_file_10mb.txt", mode="rb", encoding="utf-8"):
line = pat.sub(ur'ā\1', line)
f.write(line)
f.close()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.