免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 10385 | 回复: 33
打印 上一主题 下一主题

大侠请进:如何在英文和中文之间加入分隔符 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-27 17:49 |只看该作者 |倒序浏览
小弟目前在用python处理一份txt文件,中英文夹杂,目前一个关键问题是想在中文和英文之间加上标记,最好能变成xml的格式,例如:
  1. 【地板】 dìbǎn ? 室内铺在地面上的木板,有时也指木质楼板flooring; wooden board laid
  2. on the floor; wooden floor ?
  3. 我的目标是变成:
  4. <w>【地板】</w><p> dìbǎn</p><chexp>室内铺在地面上的木板,有时也指木质楼板</chexp><enexp>flooring; wooden board laid
  5. on the floor; wooden floor </enexp>
复制代码

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

[ 本帖最后由 wolfg 于 2006-2-27 21:27 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-02-27 18:58 |只看该作者
只要判断字符的大小,如果小于127则为英文,否则为中文。然后有一个标志位,标识是中文状态,还是英文状态,状态切换时输出上一个格式的结束和下一个格式的开始。依此类推。

论坛徽章:
0
3 [报告]
发表于 2006-02-28 11:33 |只看该作者
原帖由 limodou 于 2006-2-27 18:58 发表
只要判断字符的大小,如果小于127则为英文,否则为中文。然后有一个标志位,标识是中文状态,还是英文状态,状态切换时输出上一个格式的结束和下一个格式的开始。依此类推。


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

  1. fh =  open('c:\\Python24\\outputfile.txt','r')
  2. allLines =fh.readlines()
  3. for eachline in allLines:
  4.     i=0
  5.     length=len(eachline)
  6.    #初始化newline
  7.     if eachline[0]<127:
  8.         flag = 0   
  9.         newline='<en>'
  10.     else:
  11.         flag = 1   
  12.         newline='<zh>'
  13.     #将eachline的每个字符复制到newline遇到跳变加入标志
  14.     while i<length:
  15.         if flag==1 and eachline[i]<127:
  16.             newline = newline+'</zh><en>'+eachline[i]
  17.             flag = 0
  18.         elif flag==0 and eachline[i]>=127:
  19.             newline = newline+'</en><zh>'+eachline[i]
  20.             flag = 1
  21.         else:
  22.             newline=newline+eachline[i]
  23.         i = i+1
  24.       print newline
  25. fh.close()   
复制代码

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

[ 本帖最后由 tikico 于 2006-2-28 11:35 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-02-28 11:43 |只看该作者
要读取的文件是什么样的?每行一个词的解释吗?
能否贴出一段来看看?

论坛徽章:
0
5 [报告]
发表于 2006-02-28 15:49 |只看该作者
你的代码将文件拆成行来处理,我不是很清楚你的文件有多大。如果不大建议不要使用行来处理。如果不是以行来处理,因此象flag和标识串都应该是在循环之间先有一个初始值。然后再进行循环。

论坛徽章:
0
6 [报告]
发表于 2006-03-01 09:02 |只看该作者
原帖由 limodou 于 2006-2-28 15:49 发表
你的代码将文件拆成行来处理,我不是很清楚你的文件有多大。如果不大建议不要使用行来处理。如果不是以行来处理,因此象flag和标识串都应该是在循环之间先有一个初始值。然后再进行循环。

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

[ 本帖最后由 tikico 于 2006-3-1 10:15 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2006-03-01 14:15 |只看该作者
file对象有read()方法,可以传入每次读的大小.所以我问你文件大不大,不大就全读出来好了.不行就使用read()多读几次.为什么不使用行,我主要是想:


  1. 中文 English
  2. This is another line. 然后是中文
复制代码


象上面的情况,英文换行了,如果换行去处理,会有多余的标记.当然也不会有错.只是我不太清楚你的需求要求有多严格.而看成一个字符串则不会有这个问题.

论坛徽章:
0
8 [报告]
发表于 2006-03-02 11:03 |只看该作者
确实存在这个问题,而事实上我要处理的文件比这个复杂,还有多个标记要加,其中一段原文件如下:


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


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

  1. <w>【地板】</w><s> dìbǎn</s><exp><zh> 室内铺在地面上的木板,有时也指木质楼板</zh><en>flooring; wooden board laid
  2. on the floor; wooden floor ? same as地面dìmiàn</en> </exp>
复制代码

论坛徽章:
0
9 [报告]
发表于 2006-03-02 12:01 |只看该作者
看了你的文本,其实这里面不仅有汉字与英文的判断,还有一些格式的判断.比如说: <w>如何判断,可以通过判断【作为开始,】作为结束.汉语拼音如何判断,一种方法是将所有的汉语拼音字符列成一个list,然后判断是否在这个list.还有简单的就是认为<w></w>后面的以空格分隔的就是汉语拼音,当然这完全是通过你的格式简化出来的,一旦格式变化就出问题了.然后就是中英文的判断.

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

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

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

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

  1. 252             A3E0        ` a b c d e f g h i j k l m n o
  2. 268             A3F0        p q r s t u v w x y z { | }
复制代码

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

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

但是

  1. >>> line.find(list_py[3],0,str(line))

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

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

[ 本帖最后由 tikico 于 2006-3-3 10:07 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP