大侠请进:如何在英文和中文之间加入分隔符

大侠请进:如何在英文和中文之间加入分隔符

小弟目前在用python处理一份txt文件,中英文夹杂,目前一个关键问题是想在中文和英文之间加上标记,最好能变成xml的格式,例如:

[Copy to clipboard] [ - ]
CODE:
【地板】 dìbǎn ? 室内铺在地面上的木板,有时也指木质楼板flooring; wooden board laid
on the floor; wooden floor ?
我的目标是变成:
<w>【地板】</w><p> dìbǎn</p><chexp>室内铺在地面上的木板,有时也指木质楼板</chexp><enexp>flooring; wooden board laid
on the floor; wooden floor </enexp>

哪位大侠给点提示,不胜感激!

只要判断字符的大小,如果小于127则为英文,否则为中文。然后有一个标志位,标识是中文状态,还是英文状态,状态切换时输出上一个格式的结束和下一个格式的开始。依此类推。


QUOTE:
原帖由 limodou 于 2006-2-27 18:58 发表
只要判断字符的大小,如果小于127则为英文,否则为中文。然后有一个标志位,标识是中文状态,还是英文状态,状态切换时输出上一个格式的结束和下一个格式的开始。依此类推。

多谢,大致思路我懂了,可小弟是python的初学者,大致写成了这个样子,主要代码如下:

[Copy to clipboard] [ - ]
CODE:
fh =  open('c:\\Python24\\outputfile.txt','r')
allLines =fh.readlines()
for eachline in allLines:
    i=0
    length=len(eachline)
   #初始化newline
    if eachline[0]<127:
        flag = 0   
        newline='<en>'
    else:
        flag = 1   
        newline='<zh>'
    #将eachline的每个字符复制到newline遇到跳变加入标志
    while i<length:
        if flag==1 and eachline[i]<127:
            newline = newline+'</zh><en>'+eachline[i]
            flag = 0
        elif flag==0 and eachline[i]>=127:
            newline = newline+'</en><zh>'+eachline[i]
            flag = 1
        else:
            newline=newline+eachline[i]
        i = i+1
      print newline
fh.close()   

可是中间的标志还是打不上,就开始的标志打上了,而且以行为操作单位似乎还是不行,因为可能会多行间没出现跳变。
     关键问题在于字符串的插入,请大侠继续提示,谢谢!

要读取的文件是什么样的?每行一个词的解释吗?
能否贴出一段来看看?
你的代码将文件拆成行来处理,我不是很清楚你的文件有多大。如果不大建议不要使用行来处理。如果不是以行来处理,因此象flag和标识串都应该是在循环之间先有一个初始值。然后再进行循环。


QUOTE:
原帖由 limodou 于 2006-2-28 15:49 发表
你的代码将文件拆成行来处理,我不是很清楚你的文件有多大。如果不大建议不要使用行来处理。如果不是以行来处理,因此象flag和标识串都应该是在循环之间先有一个初始值。然后再进行循环。

谢谢limodou大侠,我有看过您的blog,很受益。
      代码修改,加上ord函数后能实现加入标记。不知大侠所说的不拆成行处理是什么含义,难道把整个文件先读出来,作为一个字符串处理吗?那对内存的要求是不是更高,还请赐教,谢谢!

file对象有read()方法,可以传入每次读的大小.所以我问你文件大不大,不大就全读出来好了.不行就使用read()多读几次.为什么不使用行,我主要是想:

[Copy to clipboard] [ - ]
CODE:
中文 English
This is another line. 然后是中文

象上面的情况,英文换行了,如果换行去处理,会有多余的标记.当然也不会有错.只是我不太清楚你的需求要求有多严格.而看成一个字符串则不会有这个问题.
确实存在这个问题,而事实上我要处理的文件比这个复杂,还有多个标记要加,其中一段原文件如下:

[Copy to clipboard] [ - ]
CODE:
dì (ㄉㄧˋ)
地 dì ? 地球;地壳 earth; earth's crust:天~ heaven and earth|~层stratum|~质geology
? 陆地land:~面earth's surface|~势terrain|高~highland|低~lowland|山~ mountainous area|~下水underground
water ? 土地;田地land; field:荒~ wasteland|下~干活儿go to work in the field ? same as地面dìmiàn
②:水泥~ cement surface ? same as地区dìqū ①:各~various localities|内~inland area|外~places
other than one's hometown ? same as地区dìqū ②:省~领导provincial and prefectural
leader|~县两级干部cadres at prefectural and county levels ? same as地方dìfānɡ
【地板】 dìbǎn ? 室内铺在地面上的木板,有时也指木质楼板flooring; wooden board laid
on the floor; wooden floor ? same as地面dìmiàn ②:~革plastic flooring|水磨石~ terrazzo
floor ? 〈方 dial.〉田地field
【地磅】 dìbànɡ same as地秤dìchènɡ

希望能将字,词,拼音,解释,英语解释,汉语解释标记都列出来,例如“地板”:

[Copy to clipboard] [ - ]
CODE:
<w>【地板】</w><s> dìbǎn</s><exp><zh> 室内铺在地面上的木板,有时也指木质楼板</zh><en>flooring; wooden board laid
on the floor; wooden floor ? same as地面dìmiàn</en> </exp>

看了你的文本,其实这里面不仅有汉字与英文的判断,还有一些格式的判断.比如说: <w>如何判断,可以通过判断【作为开始,】作为结束.汉语拼音如何判断,一种方法是将所有的汉语拼音字符列成一个list,然后判断是否在这个list.还有简单的就是认为<w></w>后面的以空格分隔的就是汉语拼音,当然这完全是通过你的格式简化出来的,一旦格式变化就出问题了.然后就是中英文的判断.

在处理是有一个标志位表示是否进入和离开某个类型.首先有一个初始的状态.然后遇到第一个,判断出现在的状态,然后与flag进行比较,如果相符,则保存到缓冲区中,如果不附,首先判断是否输出过某个开始标记,如<w>,如果没有输出,则输出当前类型的开始标记,然后将内容保存到缓冲区中.循环.如果输出过某个开始标记,则输出对应的结束标记,然后是新的开始标记.flag保存为新的状态,然后将内容保存到缓冲区.循环.

上面写得我认为的大致的思路,可能许多地方可以优化的.可以参考.


QUOTE:
原帖由 limodou 于 2006-3-2 12:01 发表
看了你的文本,其实这里面不仅有汉字与英文的判断,还有一些格式的判断.比如说: <w>如何判断,可以通过判断【作为开始,】作为结束.汉语拼音如何判断,一种方法是将所有的汉语拼音字符列成一个list,然后判断是否 ...

汉语拼音我想利用正则表达式处理,可编译器老报错“error: bad character range”,汉语拼音的编码是这样的,

[Copy to clipboard] [ - ]
CODE:
252             A3E0        ` a b c d e f g h i j k l m n o
268             A3F0        p q r s t u v w x y z { | }

有什么办法让编译通过吗?我的正则式为:'[a-z]+'。
另外试了一下List:

[Copy to clipboard] [ - ]
CODE:
>>>list_py=['a','b', 'c' ,'d', 'e', 'f', 'g', 'h', 'i' ,'j', 'k' ,'l' ,'m', 'n', 'o','p' ,'q', 'r', 's',
         't', 'u' ,'v', 'w', 'x', 'y', 'z']
>>>line='<w>【骶骨】</w> dǐɡǔ 腰椎下部五块椎骨合成的一块骨,呈三角形,上宽下窄,'
>>> line.find('d',0,len(line))
16

但是

[Copy to clipboard] [ - ]
CODE:
>>> line.find(list_py[3],0,str(line))

Traceback (most recent call last):
  File "<pyshell#8>", line 1, in -toplevel-
    line.find(list_py[3],0,str(line))
TypeError: slice indices must be integers
>>> list_py[3]
'\xa3\xe4'

这些编码问题,弄得我郁闷不已,望哪位大侠帮忙解决!