yxixi 发表于 2017-5-6 11:32:08

Python中的正则表达式匹配中文问题

  python中正则表达式匹配中文是没有问题的,但是其中有一个关键点,那就是pattern中的中文编码必须和要匹配字符串保持一致;下面使用一个例子来说明:
  # -*- coding: utf-8 -*-
  '''
  test.html内容为 :
  <div id='author_' >作  者: (美)埃克尔 著,陈昊鹏 译</div>
<div id='publisher_'>出 版 社: 机械工业出版社</div>
<ul >
<li>出版时间: 2007-6-1</li>
<li>字  数: </li>
<li>版  次: 1</li>
<li>页  数: 880</li>
<li>印刷时间: 2007-6-1</li>
<li>开  本: </li>
<li>印  次: </li>
<li>纸  张: 胶版纸</li>
<li>I S B N : 9787111213826</li>
<li>包  装: 平装</li>
</ul>
  '''
  import re
  import chardet #用于检测str的编码
  #读文件
  def readContent():
  f = file(r'/home/fzhong/test.html','r')
  content = f.read()
  f.close()
  return content
  #检测str的编码
  def checkEncoding(str):
  return chardet.detect(str)['encoding']
  def extractAttrValue(regx):
p = re.compile(regx)
attrValue = p.search(self.dataStr).group(1).strip()
return attrValue
  if __name__ == '__main__':
  content = readContent()
  #因为这里的test.html为gb2312编码,所以这里encoding应该为gb2312
  encoding = checkEncoding(content)
  p_isbn = u'<li>I S B N :(.*?)</li>'.encode(encoding )
isbn = extractAttrValue(p_isbn)

#pattern为unicode,转为和content一样的编码,然后执行匹配
  p_pub_date = u'<li>出版时间:(.*)</li>'.encode(encoding )
pubDate = extractAttrValue(p_pub_date)

p_edition_num = u'<li>版  次:(.*?)</li>'.encode(encoding )
editionNum = extractAttrValue(p_edition_num)

p_page_num = u'<li>页  数:(.*?)</li>'.encode(encoding )
pageNum = extractAttrValue(p_page_num)

p_author = ur'作  者:(.*?)</div>'.encode(encoding )
author = extractAttrValue(p_author)

p_publisher = ur'出 版 社:(.*?)</div>'.encode(encoding )
  publisher = extractAttrValue(p_publisher)
  这里有几个关键点:
  p_pub_date = u'<li>出版时间:(.*)</li>'.encode(encoding )
  执行一个unicode到encoding编码的转换;
  当然在上面的脚本中也可以这样:
  p_pub_date = '<li>出版时间:(.*)</li>'.decode('UTF-8').encode(encoding )
页: [1]
查看完整版本: Python中的正则表达式匹配中文问题