Skip to main content
 首页 » 编程设计

python之在文件 Python 中进行条件搜索和替换

2025年05月04日19rubylouvre

当需要进行条件搜索和替换时,我有一个超过 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. 

编辑:

一些背景,首先:

对于 Devanāgarī (देवनागरी),这是一项很多更艰巨的任务,不是因为编码,而是因为组合字形的规则极其复杂(至少,按照拉丁字母的标准)。例如,我在 Chrome 上写这个答案,它仍然无法正确地为“Devanāgarī”组成Devanāgarī(它在错误的地方得到了'e'的变音符号 - 它确实与双元音“ai”相同)。

文本呈现引擎组合这些字形的方式称为“连字”,对于Devanāgarī,从技术角度来看,它们非常复杂。如果您添加由 संधि (saṃdhi -- 再次说明,Chrome 的渲染会在错误的位置获取代表 anusvāra 的 bindu ),那么您会发现您在这里尝试做的事情很快就会变得极其困难。

话虽如此,如果你的问题仅限于这种简单的情况,那么我认为它可以做得干净利落。

>>> import re 
>>> inputString = u"संगम" 
>>> regex = re.compile(ur'\u0902(?=[कखगघ])') 
>>> print regex.sub(ur'ङ\u094d', inputString) 
सङ्गम 

在正则表达式中,为清楚起见,我用 unicode 转义值替换了 anusvāra 和 virāma(印地语:halant)。鉴于连字的工作方式,这可能会遗漏一些情况,但我已将我的示例切换为使用前瞻,如@Kabie 的示例(无论如何这可能是一个更好的选择),以尽可能减轻这种情况。