任意文本中的合法XML串提取

Bible_Chou 2006-11-20 10:45:17
问题描述:现有一段任意文本串(ASCII格式的字符串),其中可能包含一段或者间隔的几段合法或者不合法的XML串,要求我们对这一段文本进行解析。如果其中包含合法的XML串,则以字符串的形式提取出这些XML串,如果其中不包含XML串则返回无合法XML串结果,如果其中包含非法的XML要么返回无合法XML串的结果或者指出非法XML串的位置。
输入参数:char *text(或者string);
输出结果:
1.合法的XML串:以char *(或者string)的形式输出。
2.非法的XML串:忽略或者以串的形式输出或者指出位置。

ps : 本人最近正在做一个解析器,遇到其中嵌套XML串的情况,希望朋友们能给出帮助和指点。如果分数不够可以再加。
...全文
459 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bible_Chou 2006-11-23
  • 打赏
  • 举报
回复
mLee79 2006-11-22
  • 打赏
  • 举报
回复
这咋会是例程呢, 我才写的用来提取文件里合法的 xml 片断的, 如果是自己定义的格式, 处理起来会更简单, 同时处理脚本和xml也没什么问题吧 ...

就是这个效果:

$ cat test.x; flex xml_p.l; gcc xml_p.cpp -lstdc++;echo -------- result ----------; ./a test.x
asdfasdfasdfasdfasdfasdfasdfasdfasdsf

<abc xx='yy' tt="zz" />

asdfasdfasdfasdfasdfasdfasdfasdfasdsf

<a xx='yy' tt="zz" > athsdfasdf
asdfasdf<abc>
asdfasdfasdf
</abc>
asdf;laksdjfa;sdkfl
</a>


asdfasdfasdfffffffffffffffffffffff

-------- result ----------

<abc xx='yy' tt="zz" />


<a xx='yy' tt="zz" > athsdfasdf
asdfasdf
asdf;laksdjfa;sdkfl
<abc>
asdfasdfasdf
</abc></a>
Bible_Chou 2006-11-22
  • 打赏
  • 举报
回复
首先谢谢mLee79。
上面的的例程是采用Lex来解析一段XML代码,这个在后面单独解析XML的时候会用到,不过是下一步的工作。我目前需要做的是确定我的一段脚本(在此应该理解其为一段任意文本,并非是XML)中是否存在XML代码,如果存在就提取出来,然后解析这段XML,因为存在文法冲突所以是不能同时解析脚本和XML的。现在的重点是从脚本中提取XML而非解释。
ps : 我已经采用手工查找starttag和endtag的方法基本解决了这个问题,但是存在着一些问题,所以在此希望大家能继续提出一些其他解决方案。再次谢谢大家,对于一些比较好的建议我会酌情加分的。欢迎继续讨论。
mLee79 2006-11-22
  • 打赏
  • 举报
回复
试试这个, 处理的特别粗糙了点 .....


%{
#include <iostream>
#include <string>
#include <vector>
using namespace std;

struct xNode
{
string nodeName;
string xmlCode ;
};

vector<xNode> xStack;
xNode xNodeCurr;
string xCurrValidDoc;
string xTempCtx;

#define YY_NEVER_INTERACTIVE (1)

void xError()
{
// cerr << "ERROR: " << xTempCtx << endl;
if( xCurrValidDoc != "" ) cout << "\n" << xCurrValidDoc << "\n" << endl;
xStack.clear(); xCurrValidDoc = ""; xTempCtx = "";
}

#define xONERROR xError()

#define xADDTEMP do { xTempCtx+=yytext; } while(0)

%}



WS [[:blank:]\r\n]+
OPTWS [[:blank:]\r\n]*
IDEN [[:alpha:]_\:][[:alnum:]_\-\:]*
ATTRVALUE (\"[^\"<]*\"|\'[^\'<]*\')
ATTR {IDEN}{OPTWS}"="{OPTWS}{ATTRVALUE}
NOTLT [^<]|\r|\n
ANYC .|\r|\n
VERSIONNUN \'([a-zA-Z0-9_.:]|-)+\'|\"([a-zA-Z0-9_.:]|-)+\"

%option caseless outfile="xml_p.cpp" stack nodefault noyy_top_state
%x COMMENT PLOG CDATA NODEBEGIN NODEEND

%%
<INITIAL>{
"<!--" {xADDTEMP; BEGIN(COMMENT); }
\<\?{IDEN} {xADDTEMP; BEGIN(PLOG); }
"<![CDATA[" {xADDTEMP; BEGIN(CDATA);}
"<"{IDEN} {xNodeCurr.nodeName=yytext+1;xNodeCurr.xmlCode=yytext;BEGIN(NODEBEGIN);}
"</"{IDEN} {xNodeCurr.nodeName=yytext+2;xNodeCurr.xmlCode=yytext;BEGIN(NODEEND); }
"<" {xONERROR;}
{ANYC} {xADDTEMP;}
}
<COMMENT>{
"-->" {xADDTEMP;BEGIN(INITIAL);}
{ANYC} {xADDTEMP;}
}
<PLOG>{
"?>" {xADDTEMP;BEGIN(INITIAL);}
{ANYC} {xADDTEMP;}
}
<CDATA>{
"]]>" {xADDTEMP;BEGIN(INITIAL);}
{ANYC} {xADDTEMP;}
}
<NODEBEGIN>{
{WS}|{ATTR} {xNodeCurr.xmlCode += yytext;}
"/>" {
xNodeCurr.xmlCode += yytext;
if( !xStack.size() )
cout << "\n" << xNodeCurr.xmlCode << "\n" << endl;
else if( xCurrValidDoc == "" )
xCurrValidDoc = xNodeCurr.xmlCode;

xTempCtx += xNodeCurr.xmlCode;
BEGIN(INITIAL);
}
">" {
xNodeCurr.xmlCode += yytext;
if( xStack.size() ) xStack.back().xmlCode += xTempCtx; xTempCtx = "" ;
xStack.push_back( xNodeCurr );
BEGIN(INITIAL);
}
{ANYC} {xONERROR; BEGIN(INITIAL);}
}
<NODEEND>{
{WS} {xNodeCurr.xmlCode += yytext;}
">" {
xNodeCurr.xmlCode += yytext;
if( xStack.size() ) xStack.back().xmlCode += xTempCtx; xTempCtx = "" ;
if( !xStack.size() || xStack.back().nodeName != xNodeCurr.nodeName )
{
xONERROR;
}
else
{
xCurrValidDoc = xStack.back().xmlCode + xCurrValidDoc + xNodeCurr.xmlCode;
xStack.pop_back();
}
BEGIN(INITIAL);
}
{ANYC} {xONERROR; BEGIN(INITIAL); }
}
<COMMENT,PLOG,CDATA,NODEBEGIN,NODEEND><<EOF>> {
cerr << "\nUNEXPECTED EOF detected." << endl;
xONERROR; yyterminate();
}

%%
int yywrap() { return 1; }
int main( int argc , char* argv[] )
{
if( argc != 2 || !freopen( argv[1] , "r" , stdin ) )
cerr << "usage: xx <file>" << endl , exit(-1);
yylex();
if( xCurrValidDoc != "" ) cout << "\n" << xCurrValidDoc << "\n" << endl;
return 0;
}

Bible_Chou 2006-11-22
  • 打赏
  • 举报
回复
mLee79:说得比较在理。昨天上午已经在开始手工写提取XML串的模块。其实我目前正在做的是一个脚本解释器,其中需要直接支持XML表达式XML Expr以及正则式表达式Reg Expr.
Mobidogs 2006-11-22
  • 打赏
  • 举报
回复
#include <msxml.h> 或 #include <msxml2.h>


Bible_Chou 2006-11-22
  • 打赏
  • 举报
回复
感谢mLee79。
在此有必要说明一下,我说的例程并非是说你上面的程序是从其他地方引用的已有的程序,而是说你给出的处理本问题的示例程序。
你上面的做法的确是已经达到了预期目的解析,“分离并提取XML代码”,但是由于lex冲突以及接口等原因,所以在我现在的情况下最好不要这么实现。可能我上面并没有首先说清楚这些情况,在此表示歉意。
ps : 问题我已经解决,不过还是希望能看到大家能给出的一些解决方案和建议,所以欢迎大家继续讨论。本贴打算本周末结贴,如果没有其他人提出其他的更好的方案,将给mLee79z这位朋友70%的分数(之所以70%是为了以防斑竹误以为倒分)。
mydaisy 2006-11-21
  • 打赏
  • 举报
回复
mark
Bible_Chou 2006-11-21
  • 打赏
  • 举报
回复
再顶。
ming4098 2006-11-21
  • 打赏
  • 举报
回复
mark
mLee79 2006-11-21
  • 打赏
  • 举报
回复
就是做一个有错误恢复功能的 xml parser , 感觉如果不用考虑很多细节性的问题像 dtd , entity 什么的, 也不要求非常的完善的话, 并不复杂 ....
先做一个 xml 的词法分析器, 将文件分解为 xml 预处理 <?...?> , 注释 <!--...--> , 节点开始 <nodeName(attlist)> , 节点结束 </nodeName> , <nodeName(attrList)/>等等, 这个用 lex 简单些, 手写也不麻烦 ...
然后起个 xml 解析栈, 遇节点开始压栈, 遇节点结束则与栈顶元素比较, 匹配则记录为当前最大的有效 xml 文本并出栈, 如发生错误或不匹配则输出当前最大匹配的有效 xml 文本并清空当前解析栈 直到文件结束, 这个比较简单, 没啥必要动用 yacc 啥的重型工具 ...
Bible_Chou 2006-11-21
  • 打赏
  • 举报
回复
再顶。
OOPhaisky 2006-11-20
  • 打赏
  • 举报
回复
对,用现成的xml库比较方便,但是如果楼主对xml有很深入的研究,不用也可以。
Bible_Chou 2006-11-20
  • 打赏
  • 举报
回复
需要注意的是要分析的文本是任意文本,只是其中可能包含合法或者不合法的XML串。
Bible_Chou 2006-11-20
  • 打赏
  • 举报
回复
谢谢上面的几位朋友。不过我当前要做的是判断这段文本中是否有合法的XML串,如果有则定位并且返回这XML串。
jixingzhong 2006-11-20
  • 打赏
  • 举报
回复
libxml 或者是 MSXML ,
基于现成的库,比较快捷一些 ~
jixingzhong 2006-11-20
  • 打赏
  • 举报
回复
VC使用MSXML解析XML文档

现在XML文档应用的方面特别的多.

我把以前写过的一个例子帖出来,以备以后使用.

第一部分:DOM解析:

概述:DOM解析将会把一个完整的XML文档读进来,生成一个结构树。这样会要把XML文档全部都加载到内在中。所以解析起来的速度会要慢一些。

1、如何加载xml文件:

//创建DOM,加载XML文档
MSXML::IXMLDOMDocumentPtr pCommandDoc;
pCommandDoc.CreateInstance(__uuidof(MSXML::DOMDocument));
pCommandDoc->put_async(VARIANT_FALSE);
pCommandDoc->put_validateOnParse(VARIANT_FALSE);
pCommandDoc->put_resolveExternals(VARIANT_FALSE);
pCommandDoc->put_preserveWhiteSpace(VARIANT_TRUE);
pCommandDoc->load(file.GetBuffer(0));

2、在XML文档中查找指定的结点:

//找到
MSXML::IXMLDOMNodePtr pRootNode=pCommandDoc->selectSingleNode("root/record");
if (pRootNode==NULL)
{
return ;
}

3、得到XML文档中,结点的属性

CString strTemp;
MSXML::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
pRootNode->get_attributes(&pAttrs);
if (pAttrs==NULL)
{
return;
}
MSXML::IXMLDOMNodePtr pRequestTypeAttr=pAttrs->getQualifiedItem("name","");
_bstr_t strRequestType=pRequestTypeAttr->Gettext();
strTemp=strRequestType.operator char *();

4、得到结点的内容

_bstr_t strVisiPort=pNode->Gettext();

5、设置结点的内容

HRESULT hr=pNode->put_text(_bstr_t(m_strGatewayPassword));


6、设置一个属性内容
IXMLDOMAttribute *pa=NULL;
bstr = SysAllocString(L"属性1");
pXMLDom->createAttribute(bstr,&pNode);
var = VariantString(L"strin");
pa->put_value(var);
pRoot->setAttributeNode(pa, &pa1);

第二部分、如何使用SAX解析

概述:SAX使用的是加载式的,将会把XML文档分断,加载到内存中。使用事件通知的方式,来表示找到结点。好像没有写文档的能力吧。它的速度要比DOM快不少。

使用SAX的时候,就需要重载MSXML4.0中的一个接口ISAXContentHandler。

有几个函数重载了之后,当找到了结点之后,就会回调这一些函数。
jixingzhong 2006-11-20
  • 打赏
  • 举报
回复
写Unmanaged Code在.NET时代成为一种很悲惨的事,当你需要处理XML文件时,这种感觉会变得尤其强烈。FCL中的System.Xml多简单啊,连Steve Ballmer都知道怎么用。
事情不会总是那么理想的,如果你要在C/C++程序里处理XML怎么办呢?

选择一:市面上的XML lib还是有几个的,最有名的当然是libxml。我一年前用过,很不错,我还特意写了一份简明教程,后来不知搁哪儿了。

选择二:MS的MSXML,我要介绍的就是这个。

先说一下在MSDN哪里找文档吧,往下看的时候也好有个参考:在Index里打:Windows Media Services 9 Series SDK=>Programming Reference=>Programming Reference (C++)=>XML DOM Interfaces (C++)。什么?Windows Media?呵呵,不错,我觉得这个guide反而是最清楚的,你直接找MSXML,得到的结果,我觉得还没这个好。

在C程序里调用MSXML基本就是一堆COM接口,不过在Visual Studio里操作先要做点简单的设置:

在你的Project里Add References=>COM标签=>Microsoft XML v4.0,5.0其实也有了,但因为是和Office一起发布的,觉得有点怪,不想用,反正也未必用什么很怪异的功能,4.0可以了。



然后在加入这两行:

#include <msxml2.h>
#import <msxml4.dll>

头文件和dll库。什么?在哪里加?头文件或者c/cpp文件啊,哪里合适放哪儿。

然后就开始编程了,先定义两个必用的变量:

IXMLDOMDocumentPtr xmlFile = NULL;
IXMLDOMElement* xmlRoot = NULL;

为什么是必用的?  汗...

第一步当然是初始化COM:

if(FAILED(CoInitialize(NULL))) ....

接下来初始化xmlFile对象:

if(FAILED(xmlFile.CreateInstance("Msxml2.DOMDocument.4.0"))) ...

然后就可以加载xml文件了:

_variant_t varXml(L"C:\\test.xml"); //L for unicode
VARIANT_BOOL varOut;
xmlFile->load(varXml, &varOut);

取得root element:

xmlFile->get_documentElement(&xmlRoot))

取得第一级element:

IXMLDOMNodeList* xmlChildNodes = NULL;
xmlRoot->get_childNodes(&xmlChildNodes);

遍历所有第一级element:

IXMLDOMNode* currentNode = NULL;
while(!FAILED(xmlChildNodes->nextNode(¤tNode)) && currentNode != NULL)
{
//do something
}

取得当前element的名称:

BSTR nodeName;
currentNode->get_nodeName(&nodeName);

取得当前element的一个attribute(假设这个attribute叫type)的值:

IXMLDOMNamedNodeMap* attributes = NULL;
IXMLDOMNode* attributeName = NULL;
_bstr_t bstrAttributeName = "type";
BSTR nameVal;
currentNode->get_attributes(&attributes);
attributes->getNamedItem(bstrAttributeName, &attributeName);
attributeName->get_text(&nameVal);

需要注意的是,你要记住释放所有的借口,IXMLDOM***->Release(),这可不是.NET,有人帮你GC,你得自己调用Release()来减reference count,it's COM, remember?

好了,大致就这样,顺便提一下XPath:

_bstr_t bstrXmlQuery = L"/books/book[@type=scifi and @author=fox]";
IXMLDOMNodeList* nodes = NULL;
if(FAILED(xmlRoot->selectNodes(bstrXmlQuery, &nodes)) || FAILED(nodes->get_length(&length)) || length == 0)
//no match found or something went wrong
else
//match found

上面是找这样的node:

<books>
<book type="scifi" author="fox">....
</book>
....
</books>

具体的XPath语法就查手册吧,到处都有。

哦,对了,忘了说:如果你全部用ATL的类的话,借口的调用会简单一点,不过很容易转换的,比如:

IXMLDOMDocument* 对应 IXMLDOMDocumentPtr(我这里用了),其他基本也是加个Ptr,我不废话了。

最后提供一个sample,我临时攒的。工作的时候写的程序当然不能拿来贴的,呵呵。这个sample基本就是遍历整个xml,然后报告一遍文件的结构,对每个node,如果它有一个叫id的attribute,就同时打印id的值。If you want the complete VS project, shoot me an email. But I guess no one really needs it anyway, right, : )

#include "stdafx.h"
#include <windows.h>
#include <msxml2.h>
#import <msxml4.dll>

HANDLE logFile = NULL;

#define INDENT 4

#define TESTHR(hr) \
{ \
if(FAILED(hr)) goto fail; \
}

void PrintChild(IXMLDOMNodeList* nodeList, int level)
{
if(nodeList == NULL)
return;

IXMLDOMNode* currentNode = NULL;
IXMLDOMNodeList* childNodes = NULL;
IXMLDOMNamedNodeMap* attributes = NULL;
IXMLDOMNode* attributeID = NULL;

while(!FAILED(nodeList->nextNode(¤tNode)) && currentNode != NULL)
{
BSTR nodeName;
TESTHR(currentNode->get_nodeName(&nodeName));
DWORD dwBytesWritten;
for(int i=0; i<level*INDENT; i++)
WriteFile(logFile, L" ", (DWORD)(sizeof(WCHAR)), &dwBytesWritten, NULL);

//WCHAR msg[MAX_SIZE];
//wsprintf(msg, L"%s ", nodeName);
WriteFile(logFile, nodeName, (DWORD)(wcslen(nodeName)*sizeof(WCHAR)), &dwBytesWritten, NULL);

TESTHR(currentNode->get_attributes(&attributes));
if(attributes!=NULL)
{
_bstr_t bstrAttributeName = "id";
BSTR idVal;
TESTHR(attributes->getNamedItem(bstrAttributeName, &attributeID));
if(attributeID != NULL)
{
TESTHR(attributeID->get_text(&idVal));
WriteFile(logFile, L" ", (DWORD)(sizeof(WCHAR)), &dwBytesWritten, NULL);
WriteFile(logFile, idVal, (DWORD)(wcslen(idVal)*sizeof(WCHAR)), &dwBytesWritten, NULL);
WriteFile(logFile, L"\r\n", (DWORD)(2*sizeof(WCHAR)), &dwBytesWritten, NULL);
attributeID->Release(); attributeID = NULL;
}
else
{
WriteFile(logFile, L"\r\n", (DWORD)(2*sizeof(WCHAR)), &dwBytesWritten, NULL);
}
attributes->Release(); attributes = NULL;

}
else
{
WriteFile(logFile, L"\r\n", (DWORD)(2*sizeof(WCHAR)), &dwBytesWritten, NULL);
}

TESTHR(currentNode->get_childNodes(&childNodes));
PrintChild(childNodes, level+1);
currentNode=NULL;
}

fail:
if(childNodes!=NULL)
childNodes->Release();
if(attributeID!=NULL)
attributeID->Release();
if(attributes!=NULL)
attributes->Release();
if(currentNode != NULL)
currentNode->Release();
}

int _tmain(int argc, _TCHAR* argv[])
{

IXMLDOMDocumentPtr xmlFile = NULL;
IXMLDOMElement* xmlRoot = NULL;
_variant_t varXml(L"C:\\demo1.xml");

logFile = CreateFile(L"log.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(logFile == INVALID_HANDLE_VALUE)
goto fail;

TESTHR(CoInitialize(NULL));

TESTHR(xmlFile.CreateInstance("Msxml2.DOMDocument.4.0"));

VARIANT_BOOL varOut;
TESTHR(xmlFile->load(varXml, &varOut));

TESTHR(xmlFile->get_documentElement(&xmlRoot));

BSTR rootName;
DWORD dwBytesWritten;
TESTHR(xmlRoot->get_nodeName(&rootName));
WriteFile(logFile, rootName, (DWORD)(wcslen(rootName)*sizeof(WCHAR)), &dwBytesWritten, NULL);
WriteFile(logFile, L"\r\n", (DWORD)(2*sizeof(WCHAR)), &dwBytesWritten, NULL);

IXMLDOMNodeList* xmlChildNodes = NULL;
TESTHR(xmlRoot->get_childNodes(&xmlChildNodes));

PrintChild(xmlChildNodes, 2);

fail:
if(logFile != INVALID_HANDLE_VALUE)
CloseHandle(logFile);
if(xmlChildNodes!=NULL)
xmlChildNodes->Release();
if(xmlRoot!=NULL)
xmlRoot->Release();
return 0;
}
taodm 2006-11-20
  • 打赏
  • 举报
回复
直接用现成的xml库不就可以了
Bible_Chou 2006-11-20
  • 打赏
  • 举报
回复
再顶。
大家提下比较具体的意见阿。
加载更多回复(1)
文名: 正则表达式经典实例 原名: Regular Expression Cookbook 作者: (美)高瓦特斯(Goyvaerts,J.) (美)利维森(Levithan,S.)译者: 郭耀 资源格式: PDF 版本: 扫描版 出版社: 人民邮电出版社书号: 9787115228321发行时间: 2010年06月01日 地区: 大陆 语言: 简体文 简介: 编辑推荐 每个程序员都会遇到需要使用正则表达式的情况,但是要用好正则表达式却并不容易。本书提供了100多个实例,以帮助读者使用正则表达式处理数据和文本。即使有经验的用户也经常会遇到性能不佳、误报、漏报等让人挠头的错误,本书对于如何使用正则表达式来解决一些常见的问题给出了按部就班的解决方案,其包括c#、Java、JavaScript、Perl、PHP、Python、Ruby和VB.NET的实例。   本书主要包括以下内容:   通过一个精练的教程理解正则表达式的基本原理和技巧;   在不同的编程语言和脚本语言有效使用正则表达式;   学习如何对输入进行合法性检查和格式化;   处理单词、文本行、特殊字符和数值;   学习如何在URL、路径、标记语言和数据交换使用正则   表达式;   学习更高深的正则表达式特性的微妙之处;   理解在不同语言正则表达式的APl、语法和行为之间的   区别;   创建更好的正则表达式来满足个性化的需求。 内容简介 本书讲解了基于8种常用的编程语言使用正则表达式的经典实例。书提供了上百种可以在实战使用的实例,以帮助读者使用正则表达式来处理数据和文本。对于如何使用正则表达式来解决性能不佳、误报、漏报等常见的错误以及完成一些常见的任务,本书给出了涉及基于C#、Java、JavaScript、Perl、PHP、Python、Ruby和VB.NET等编程语言的解决方案。   本书的读者对象是对正则表达式感兴趣的软件开发人员和系统管理员。本书旨在教会读者很多新的技巧以及如何避免语言特定的陷阱,读者可以通过本书提供的实例解决方案库来解决实践的复杂问题。 作者简介 Jan Goyvaerts领导着Just Great Software公司,他在这个公司设计和开发了一些最流行的正则表达式软件。他的产品包括RegexBuddy,世界上唯一可以模拟l5种正则表达式流派特性的正则表达式编辑器,以及PowerGREP,Microsoft Windows平台上功能最强大的9rep工具。 目录: 第1章 正则表达式简介 1.1 正则表达式的定义 1.2 使用正则表达式的工具 第2章 正则表达式的基本技巧 2.1 匹配字面文本 2.2 匹配不可打印字符 2.3 匹配多个字符之一 2.4 匹配任意字符 2.5 匹配文本行起始和/或文本行结尾 2.6 匹配整个单词 2.7 Unicode代码点、属性、区块和脚本 2.8 匹配多个选择分支之一 2.9 分组和捕获匹配的子 2.10 再次匹配先前匹配的文本 2.11 捕获和命名匹配子 2.12 把正则表达式的一部分重复多次 2.13 选择最小和最大重复次数 2.14 消除不必要的回溯 2.15 避免重复逃逸 2.16 检查一个匹配,但不添加到整体匹配 2.17 根据条件匹配两者之一 2.18 向正则表达式添加注释 2.19 在替代文本添加字面文本 2.20 在替代文本添加正则匹配 2.21 把部分的正则匹配添加到替代文本 2.22 把匹配上下文插入到替代文本 第3章 使用正则表达式编程 3.1 在源代码使用字面正则表达式 3.2 导入正则表达式函数库 3.3 创建正则表达式对象 3.4 设置正则表达式选项 3.5 检查是否可以在目标字符找到匹配 3.6 检查正则表达式能否整个匹配目标字符 3.7 获取匹配文本 3.8 决定匹配的位置和长度 3.9 获取匹配文本的一部分 3.10 获取所有匹配的列表 3.11 遍历所有匹配 3.12 在过程代码对匹配结果进行验证 3.13 在另一个匹配查找匹配 3.14 替换所有匹配 3.15 使用匹配的子来替换匹配 3.16 使用代码生成的替代文本来替换匹配 3.17 替换另一个正则式匹配的所有匹配 3.18 替换另一个正则式匹配之间的所有匹配 3.19 拆分字符 3.20 拆分字符,保留正则匹配 3.21 逐行查找 第4章 合法性验证和格式化 4.1 E-mail地址的合法性验证 4.2 北美电话号码的合法性验证和格式化 4.3 国际电话号码的合法性验证 4.4 传统日期格式的合法性验证 4.5 对传统日期格式进行精确的合法性验证 4.6 传统时间格式的合法性验证 4.7 检查ISO 8601格式的日期和时间 4.8 限制输入只能为字母数字字符 4.9 限制文本长度 4.10 限制文本的行数 4.11 肯定响应的检查 4.12 社会安全号码的合法性验证 4.13 ISBN的合法性验证 4.14 ZIP代码的合法性验证 4.15 加拿大邮政编码的合法性验证 4.16 英国邮政编码的合法性验证 4.17 查找使用邮局信箱的地址 4.18 转换姓名格式 4.19 信用卡号码的合法性验证 4.20 欧盟增值税代码 第5章 单词、文本行和特殊字符 5.1 查找一个特定单词 5.2 查找多个单词之一 5.3 查找相似单词 5.4 查找除某个单词之外的任意单词 5.5 查找后面不跟着某个特定单词的任意单词 5.6 查找不跟在某个特定单词之后的任意单词 5.7 查找临近单词 5.8 查找重复单词 5.9 删除重复的文本行 5.10 匹配包含某个单词的整行内容 5.11 匹配不包含某个单词的整行 5.12 删除前导和拖尾的空格 5.13 把重复的空白替换为单个空格 5.14 对正则表达式元字符进行转义 第6章 数字 6.1 整数 6.2 十六进制数字 6.3 二进制数 6.4 删除前导 6.5 位于某个特定范围之内的整数 6.6 在某个特定范围之内的十六进制数 6.7 浮点数 6.8 含有千位分隔符的数 6.9 罗马数字 第7章 URL、路径和Internet地址 7.1 URL合法性验证 7.2 在全文查找URL 7.3 在全文查找加引号的URL 7.4 在全文寻找加括号的URL 7.5 把URL转变为链接 7.6 URN合法性验证 7.7 通用URL的合法性验证 7.8 从URL提取通信协议方案 7.9 从URL抽取用户名 7.10 从URL抽取主机名 7.11 从URL抽取端口号 7.12 从URL抽取路径 7.13 从URL抽取查询 7.14 从URL抽取片段 7.15 域名合法性验证 7.16 匹配IPv4地址 7.17 匹配IPv6地址 7.18 Windows路径的合法性验证 7.19 分解Windows路径 7.20 从Windows路径抽取盘符 7.21 从UNC路径抽取服务器和共享名 7.22 从Windows路径抽取文件夹 7.23 从Windows路径抽取文件名 7.24 从Windows路径抽取文件扩展名 7.25 去除文件名的非法字符 第8章 标记语言和数据交换 8.1 查找XML风格的标签 8.2 把标签b替换为strong 8.3 删掉除em和strong之外的所有XML风格标签 8.4 匹配XML名称 8.5 添加p和br标签将纯文本转换为HTML 8.6 在XML风格的标签查找某个特定属性 8.7 向不包含cellspacing属性的 table标签添加该属性 8.8 删除XML风格的注释 8.9 在XML风格的注释查找单词 8.10 替换在CSV文件使用的分隔符 8.11 抽取某个特定列的CSV域 8.12 匹配INI段头 8.13 匹配INI段块 8.14 匹配INI名称-值对
文名: 正则表达式经典实例 原名: Regular Expression Cookbook 作者: (美)高瓦特斯(Goyvaerts,J.) (美)利维森(Levithan,S.)译者: 郭耀 资源格式: PDF 版本: 扫描版 出版社: 人民邮电出版社书号: 9787115228321发行时间: 2010年06月01日 地区: 大陆 语言: 简体文 简介: 编辑推荐 每个程序员都会遇到需要使用正则表达式的情况,但是要用好正则表达式却并不容易。本书提供了100多个实例,以帮助读者使用正则表达式处理数据和文本。即使有经验的用户也经常会遇到性能不佳、误报、漏报等让人挠头的错误,本书对于如何使用正则表达式来解决一些常见的问题给出了按部就班的解决方案,其包括c#、Java、JavaScript、Perl、PHP、Python、Ruby和VB.NET的实例。   本书主要包括以下内容:   通过一个精练的教程理解正则表达式的基本原理和技巧;   在不同的编程语言和脚本语言有效使用正则表达式;   学习如何对输入进行合法性检查和格式化;   处理单词、文本行、特殊字符和数值;   学习如何在URL、路径、标记语言和数据交换使用正则   表达式;   学习更高深的正则表达式特性的微妙之处;   理解在不同语言正则表达式的APl、语法和行为之间的   区别;   创建更好的正则表达式来满足个性化的需求。 内容简介 本书讲解了基于8种常用的编程语言使用正则表达式的经典实例。书提供了上百种可以在实战使用的实例,以帮助读者使用正则表达式来处理数据和文本。对于如何使用正则表达式来解决性能不佳、误报、漏报等常见的错误以及完成一些常见的任务,本书给出了涉及基于C#、Java、JavaScript、Perl、PHP、Python、Ruby和VB.NET等编程语言的解决方案。   本书的读者对象是对正则表达式感兴趣的软件开发人员和系统管理员。本书旨在教会读者很多新的技巧以及如何避免语言特定的陷阱,读者可以通过本书提供的实例解决方案库来解决实践的复杂问题。 作者简介 Jan Goyvaerts领导着Just Great Software公司,他在这个公司设计和开发了一些最流行的正则表达式软件。他的产品包括RegexBuddy,世界上唯一可以模拟l5种正则表达式流派特性的正则表达式编辑器,以及PowerGREP,Microsoft Windows平台上功能最强大的9rep工具。 目录: 第1章 正则表达式简介 1.1 正则表达式的定义 1.2 使用正则表达式的工具 第2章 正则表达式的基本技巧 2.1 匹配字面文本 2.2 匹配不可打印字符 2.3 匹配多个字符之一 2.4 匹配任意字符 2.5 匹配文本行起始和/或文本行结尾 2.6 匹配整个单词 2.7 Unicode代码点、属性、区块和脚本 2.8 匹配多个选择分支之一 2.9 分组和捕获匹配的子 2.10 再次匹配先前匹配的文本 2.11 捕获和命名匹配子 2.12 把正则表达式的一部分重复多次 2.13 选择最小和最大重复次数 2.14 消除不必要的回溯 2.15 避免重复逃逸 2.16 检查一个匹配,但不添加到整体匹配 2.17 根据条件匹配两者之一 2.18 向正则表达式添加注释 2.19 在替代文本添加字面文本 2.20 在替代文本添加正则匹配 2.21 把部分的正则匹配添加到替代文本 2.22 把匹配上下文插入到替代文本 第3章 使用正则表达式编程 3.1 在源代码使用字面正则表达式 3.2 导入正则表达式函数库 3.3 创建正则表达式对象 3.4 设置正则表达式选项 3.5 检查是否可以在目标字符找到匹配 3.6 检查正则表达式能否整个匹配目标字符 3.7 获取匹配文本 3.8 决定匹配的位置和长度 3.9 获取匹配文本的一部分 3.10 获取所有匹配的列表 3.11 遍历所有匹配 3.12 在过程代码对匹配结果进行验证 3.13 在另一个匹配查找匹配 3.14 替换所有匹配 3.15 使用匹配的子来替换匹配 3.16 使用代码生成的替代文本来替换匹配 3.17 替换另一个正则式匹配的所有匹配 3.18 替换另一个正则式匹配之间的所有匹配 3.19 拆分字符 3.20 拆分字符,保留正则匹配 3.21 逐行查找 第4章 合法性验证和格式化 4.1 E-mail地址的合法性验证 4.2 北美电话号码的合法性验证和格式化 4.3 国际电话号码的合法性验证 4.4 传统日期格式
第一章:数据结构和算法 1.1 解压序列赋值给多个变量 1.2 解压可迭代对象赋值给多个变量 1.3 保留最后N个元素 1.4 查找最大或最小的N个元素 1.5 实现一个优先级队列 1.6 字典的键映射多个值 1.7 字典排序 1.8 字典的运算 1.9 查找两字典的相同点 1.10 删除序列相同元素并保持顺序 1.11 命名切片 1.12 序列出现次数最多的元素 1.13 通过某个关键字排序一个字典列表 1.14 排序不支持原生比较的对象 1.15 通过某个字段将记录分组 1.16 过滤序列元素 1.17 从字典提取子集 1.18 映射名称到序列元素 1.19 转换并同时计算数据 1.20 合并多个字典或映射 第二章:字符文本 2.1 使用多个界定符分割字符 2.2 字符开头或结尾匹配 2.3 用Shell通配符匹配字符 2.4 字符匹配和搜索 2.5 字符搜索和替换 2.6 字符忽略大小写的搜索替换 2.7 最短匹配模式 2.8 多行匹配模式 2.9 将Unicode文本标准化 2.10 在正则式使用Unicode 2.11 删除字符不需要的字符 2.12 审查清理文本字符 2.13 字符对齐 2.14 合并拼接字符 2.15 字符插入变量 2.16 以指定列宽格式化字符 2.17 在字符处理html和xml 2.18 字符令牌解析 2.19 实现一个简单的递归下降分析器 2.20 字节字符上的字符操作 第三章:数字日期和时间 3.1 数字的四舍五入 3.2 执行精确的浮点数运算 3.3 数字的格式化输出 3.4 二八十六进制整数 3.5 字节到大整数的打包与解包 3.6 复数的数学运算 3.7 无穷大与NaN 3.8 分数运算 3.9 大型数组运算 3.10 矩阵与线性代数运算 3.11 随机选择 3.12 基本的日期与时间转换 3.13 计算最后一个周五的日期 3.14 计算当前月份的日期范围 3.15 字符转换为日期 3.16 结合时区的日期操作 第四章:迭代器与生成器 4.1 手动遍历迭代器 4.2 代理迭代 4.3 使用生成器创建新的迭代模式 4.4 实现迭代器协议 4.5 反向迭代 4.6 带有外部状态的生成器函数 4.7 迭代器切片 4.8 跳过可迭代对象的开始部分 4.9 排列组合的迭代 4.10 序列上索引值迭代 4.11 同时迭代多个序列 4.12 不同集合上元素的迭代 4.13 创建数据处理管道 4.14 展开嵌套的序列 4.15 顺序迭代合并后的排序迭代对象 4.16 迭代器代替while无限循环 第五章:文件与IO 5.1 读写文本数据 5.2 打印输出至文件 5.3 使用其他分隔符或行终止符打印 5.4 读写字节数据 5.5 文件不存在才能写入 5.6 字符的I/O操作 5.7 读写压缩文件 5.8 固定大小记录的文件迭代 5.9 读取二进制数据到可变缓冲区 5.10 内存映射的二进制文件 5.11 文件路径名的操作 5.12 测试文件是否存在 5.13 获取文件夹的文件列表 5.14 忽略文件名编码 5.15 打印不合法的文件名 5.16 增加或改变已打开文件的编码 5.17 将字节写入文本文件 5.18 将文件描述符包装成文件对象 5.19 创建临时文件和文件夹 5.20 与行端口的数据通信 5.21 序列化Python对象 第六章:数据编码和处理 6.1 读写CSV数据 6.2 读写JSON数据 6.3 解析简单的XML数据 6.4 增量式解析大型XML文件 6.5 将字典转换为XML 6.6 解析和修改XML 6.7 利用命名空间解析XML文档 6.8 与关系型数据库的交互 6.9 编码和解码十六进制数 6.10 编码解码Base64数据 6.11 读写二进制数组数据 6.12 读取嵌套和可变长二进制数据 6.13 数据的累加与统计操作 第七章:函数 7.1 可接受任意数量参数的函数 7.2 只接受关键字参数的函数 7.3 给函数参数增加元信息 7.4 返回多个值的函数 7.5 定义有默认参数的函数 7.6 定义匿名或内联函数 7.7 匿名函数捕获变量值 7.8 减少可调用对象的参数个数 7.9 将单方法的类转换为函数 7.10 带额外状态信息的回调函数 7.11 内联回调函数 7.12 访问闭包定义的变量 第八章:类与对象 8.1 改变对象的字符显示 8.2 自定义字符的格式化 8.3 让对象支持上下文管理协议 8.4 创建大量对象时节省内存方法 8.5 在类封装属性名 8.6 创建可管理的属性 8.7 调用父类方法 8.8 子类扩展property 8.9 创建新的类或实例属性 8.10 使用延迟计算属性 8.11 简化数据结构的初始化 8.12 定义接口或者抽象基类 8.13 实现数据模型的类型约束 8.14 实现自定义容器 8.15 属性的代理访问 8.16 在类定义多个构造器 8.17 创建不调用init方法的实例 8.18 利用Mixins扩展类功能 8.19 实现状态对象或者状态机 8.20 通过字符调用对象方法 8.21 实现访问者模式 8.22 不用递归实现访问者模式 8.23 循环引用数据结构的内存管理 8.24 让类支持比较操作 8.25 创建缓存实例 第九章:元编程 9.1 在函数上添加包装器 9.2 创建装饰器时保留函数元信息 9.3 解除一个装饰器 9.4 定义一个带参数的装饰器 9.5 可自定义属性的装饰器 9.6 带可选参数的装饰器 9.7 利用装饰器强制函数上的类型检查 9.8 将装饰器定义为类的一部分 9.9 将装饰器定义为类 9.10 为类和静态方法提供装饰器 9.11 装饰器为被包装函数增加参数 9.12 使用装饰器扩充类的功能 9.13 使用元类控制实例的创建 9.14 捕获类的属性定义顺序 9.15 定义有可选参数的元类 9.16 *args和**kwargs的强制参数签名 9.17 在类上强制使用编程规约 9.18 以编程方式定义类 9.19 在定义的时候初始化类的成员 9.20 利用函数注解实现方法重载 9.21 避免重复的属性方法 9.22 定义上下文管理器的简单方法 9.23 在局部变量域执行代码 9.24 解析与分析Python源码 9.25 拆解Python字节码 第十章:模块与包 10.1 构建一个模块的层级包 10.2 控制模块被全部导入的内容 10.3 使用相对路径名导入包子模块 10.4 将模块分割成多个文件 10.5 利用命名空间导入目录分散的代码 10.6 重新加载模块 10.7 运行目录或压缩文件 10.8 读取位于包的数据文件 10.9 将文件夹加入到sys.path 10.10 通过字符名导入模块 10.11 通过导入钩子远程加载模块 10.12 导入模块的同时修改模块 10.13 安装私有的包 10.14 创建新的Python环境 10.15 分发包 第十一章:网络与Web编程 11.1 作为客户端与HTTP服务交互 11.2 创建TCP服务器 11.3 创建UDP服务器 11.4 通过CIDR地址生成对应的IP地址集 11.5 创建一个简单的REST接口 11.6 通过XML-RPC实现简单的远程调用 11.7 在不同的Python解释器之间交互 11.8 实现远程方法调用 11.9 简单的客户端认证 11.10 在网络服务加入SSL 11.11 进程间传递Socket文件描述符 11.12 理解事件驱动的IO 11.13 发送与接收大型数组 第十二章:并发编程 12.1 启动与停止线程 12.2 判断线程是否已经启动 12.3 线程间通信 12.4 给关键部分加锁 12.5 防止死锁的加锁机制 12.6 保存线程的状态信息 12.7 创建一个线程池 12.8 简单的并行编程 12.9 Python的全局锁问题 12.10 定义一个Actor任务 12.11 实现消息发布/订阅模型 12.12 使用生成器代替线程 12.13 多个线程队列轮询 12.14 在Unix系统上面启动守护进程 第十三章:脚本编程与系统管理 13.1 通过重定向/管道/文件接受输入 13.2 终止程序并给出错误信息 13.3 解析命令行选项 13.4 运行时弹出密码输入提示 13.5 获取终端的大小 13.6 执行外部命令并获取它的输出 13.7 复制或者移动文件和目录 13.8 创建和解压压缩文件 13.9 通过文件名查找文件 13.10 读取配置文件 13.11 给简单脚本增加日志功能 13.12 给内库增加日志功能 13.13 记录程序执行的时间 13.14 限制内存和CPU的使用量 13.15 启动一个WEB浏览器 第十四章:测试、调试和异常 14.1 测试输出到标准输出上 14.2 在单元测试给对象打补丁 14.3 在单元测试测试异常情况 14.4 将测试输出用日志记录到文件 14.5 忽略或者期望测试失败 14.6 处理多个异常 14.7 捕获所有异常 14.8 创建自定义异常 14.9 捕获异常后抛出另外的异常 14.10 重新抛出最后的异常 14.11 输出警告信息 14.12 调试基本的程序崩溃错误 14.13 给你的程序做基准测试 14.14 让你的程序跑的更快 第十五章:C语言扩展 15.1 使用ctypes访问C代码 15.2 简单的C扩展模块 15.3 一个操作数组的扩展函数 15.4 在C扩展模块操作隐形指针 15.5 从扩张模块定义和导出C的API 15.6 从C语言调用Python代码 15.7 从C扩展释放全局锁 15.8 C和Python的线程混用 15.9 用WSIG包装C代码 15.10 用Cython包装C代码 15.11 用Cython写高性能的数组操作 15.12 将函数指针转换为可调用对象 15.13 传递NULL结尾的字符给C函数库 15.14 传递Unicode字符给C函数库 15.15 C字符转换为Python字符 15.16 不确定编码格式的C字符 15.17 传递文件名给C扩展 15.18 传递已打开的文件给C扩展 15.19 从C语言读取类文件对象 15.20 处理C语言的可迭代对象 15.21 诊断分析代码错误
第1章 文本 1 引言 1 1.1 每次处理一个字符 6 1.2 字符和字符值之间的转换 7 1.3 测试一个对象是否是类字符 8 1.4 字符对齐 10 1.5 去除字符两端的空格 11 1.6 合并字符 11 1.7 将字符逐字符或逐词反转 14 1.8 检查字符是否包含某字符集合的字符 15 1.9 简化字符的translate方法的使用 18 1.10 过滤字符不属于指定集合的字符 20 1.11 检查一个字符文本还是二进制 23 1.12 控制大小写 25 1.13 访问子字符 26 1.14 改变多行文本字符的缩进 29 1.15 扩展和压缩制表符 31 1.16 替换字符的子 33 1.17 替换字符的子-Python 2.4 34 1.18 一次完成多个替换 36 1.19 检查字符的结束标记 39 1.20 使用Unicode来处理国际化文本 40 1.21 在Unicode和普通字符之间转换 43 1.22 在标准输出打印Unicode字符 45 1.23 对Unicode数据编码并用于XML和HTML 46 1.24 让某些字符大小写不敏感 49 1.25 将HTML文档转化为文本显示到UNIX终端上 52 第2章 文件 55 引言 55 2.1 读取文件 59 2.2 写入文件 62 2.3 搜索和替换文件文本 64 2.4 从文件读取指定的行 65 2.5 计算文件的行数 66 2.6 处理文件的每个词 68 2.7 随机输入/输出 70 2.8 更新随机存取文件 71 2.9 从zip文件读取数据 73 2.10 处理字符的zip文件 74 2.11 将文件树归档到一个压缩的tar文件 76 2.12 将二进制数据发送到Windows的标准输出 77 2.13 使用C++的类iostream语法 78 2.14 回退输入文件到起点 80 2.15 用类文件对象适配真实文件对象 83 2.16 遍历目录树 84 2.17 在目录树改变文件扩展名 85 2.18 从指定的搜索路径寻找文件 86 2.19 根据指定的搜索路径和模式寻找文件 87 2.20 在Python的搜索路径寻找文件 88 2.21 动态地改变Python搜索路径 89 2.22 计算目录间的相对路径 91 2.23 跨平台地读取无缓存的字符 93 2.24 在Mac OS X平台上统计PDF文档的页数 94 2.25 在Windows平台上修改文件属性 95 2.26 从OpenOffice.org文档提取文本 96 2.27 从微软Word文档抽取文本 97 2.28 使用跨平台的文件锁 98 2.29 带版本号的文件名 100 2.30 计算CRC-64循环冗余码校验 102 第3章 时间和财务计算 105 引言 105 3.1 计算昨天和明天的日期 111 3.2 寻找上一个星期五 112 3.3 计算日期之间的时段 114 3.4 计算歌曲的总播放时间 115 3.5 计算日期之间的工作日 116 3.6 自动查询节日 118 3.7 日期的模糊查询 121 3.8 检查夏令时是否正在实行 123 3.9 时区转换 124 3.10 反复执行某个命令 125 3.11 定时执行命令 127 3.12 十进制数学计算 129 3.13 将十进制数用于货币处理 130 3.14 用Python实现的简单加法器 133 3.15 检查信用卡校验和 136 3.16 查看汇率 137 第4章 Python技巧 139 引言 139 4.1 对象拷贝 140 4.2 通过列表推导构建列表 144 4.3 若列表某元素存在则返回之 146 4.4 循环访问序列的元素和索引 147 4.5 在无须共享引用的条件下创建列表的列表 148 4.6 展开一个嵌套的序列 149 4.7 在行列表完成对列的删除和排序 152 4.8 二维阵列变换 154 4.9 从字典取值 155 4.10 给字典增加一个条目 157 4.11 在无须过多援引的情况下创建字典 158 4.12 将列表元素交替地作为键和值来创建字典 159 4.13 获取字典的一个子集 161 4.14 反转字典 163 4.15 字典的一键多值 164 4.16 用字典分派方法和函数 166 4.17 字典的并集与交集 167 4.18 搜集命名的子项 169 4.19 用一条语句完成赋值和测试 171 4.20 在Python使用printf 174 4.21 以指定的概率获取元素 174 4.22 在表达式处理异常 176 4.23 确保名字已经在给定模块被定义 178 第5章 搜索和排序 180 引言 180 5.1 对字典排序 185 5.2 不区分大小写对字符列表排序 185 5.3 根据对象的属性将对象列表排序 187 5.4 根据对应值将键或索引排序 189 5.5 根据内嵌的数字将字符排序 192 5.6 以随机顺序处理列表的元素 193 5.7 在增加元素时保持序列的顺序 195 5.8 获取序列最小的几个元素 197 5.9 在排序完毕的序列寻找元素 199 5.10 选取序列最小的第n个元素 200 5.11 三行代码的快速排序 203 5.12 检查序列的成员 206 5.13 寻找子序列 208 5.14 给字典类型增加排名功能 210 5.15 根据姓的首字母将人名排序和分组 214 第6章 面向对象编程 217 引言 217 6.1 温标的转换 223 6.2 定义常量 225 6.3 限制属性的设置 227 6.4 链式字典查询 229 6.5 继承的替代方案-自动托管 231 6.6 在代理托管特殊方法 234 6.7 有命名子项的元组 237 6.8 避免属性读写的冗余代码 239 6.9 快速复制对象 240 6.10 保留对被绑定方法的引用且支持垃圾回收 243 6.11 缓存环的实现 245 6.12 检查一个实例的状态变化 249 6.13 检查一个对象是否包含某种必要的属性 252 6.14 实现状态设计模式 255 6.15 实现单例模式 257 6.16 用Borg惯用法来避免“单例”模式 259 6.17 Null对象设计模式的实现 263 6.18 用_ _init_ _参数自动初始化实例变量 266 6.19 调用超类的_ _init_ _方法 267 6.20 精确和安全地使用协作的超类调用 270 第7章 持久化和数据库 273 引言 273 7.1 使用marshal模块序列化数据 275 7.2 使用pickle和cPickle模块序列化数据 277 7.3 在Pickling的时候压缩 280 7.4 对类和实例使用cPickle模块 281 7.5 Pickling被绑定方法 284 7.6 Pickling代码对象 286 7.7 通过shelve修改对象 288 7.8 使用Berkeley DB数据库 291 7.9 访问MySQL数据库 294 7.10 在MySQL数据库储存BLOB 295 7.11 在PostgreSQL储存BLOB 296 7.12 在SQLite储存BLOB 298 7.13 生成一个字典将字段名映射为列号 300 7.14 利用dtuple实现对查询结果的灵活访问 302 7.15 打印数据库游标的内容 304 7.16 适用于各种DB API模块的单参数传递风格 306 7.17 通过ADO使用Microsoft Jet 308 7.18 从Jython Servlet访问JDBC数据库 310 7.19 通过Jython和ODBC获得Excel数据 313 第8章 调试和测试 315 引言 315 8.1 阻止某些条件和循环的执行 316 8.2 在Linux上测量内存使用 317 8.3 调试垃圾回收进程 318 8.4 捕获和记录异常 320 8.5 在调试模式跟踪表达式和注释 322 8.6 从traceback获得更多信息 324 8.7 当未捕获异常发生时自动启用调试器 327 8.8 简单的使用单元测试 328 8.9 自动运行单元测试 330 8.10 在Python 2.4使用doctest和unittest 331 8.11 在单元测试检查区间 334 第9章 进程、线程和同步 336 引言 336 9.1 同步对象的所有方法 339 9.2 终止线程 342 9.3 将Queue.Queue用作优先级队列 344 9.4 使用线程池 346 9.5 以多组参数并行执行函数 349 9.6 用简单的消息传递协调线程 351 9.7 储存线程信息 353 9.8 无线程的多任务协作 357 9.9 在Windows探测另一个脚本实例的运行 359 9.10 使用MsgWaitForMultipleObjects处理Windows消息 360 9.11 用popen驱动外部进程 363 9.12 获取UNIX Shell命令的输出流和错误流 364 9.13 在UNIXfork一个守护进程 367 第10章 系统管理 370 引言 370 10.1 生成随机密码 371 10.2 生成易记的伪随机密码 372 10.3 以POP服务器的方式验证用户 375 10.4 统计Apache每个IP的点击率 376 10.5 统计Apache的客户缓存的命率 378 10.6 在脚本调用编辑器 379 10.7 备份文件 381 10.8 选择性地复制邮箱文件 383 10.9 通过邮箱创建一个邮件地址的白名单 384 10.10 阻塞重复邮件 386 10.11 检查你的Windows声音系统 388 10.12 在Windows注册和反注册DLL 388 10.13 检查并修改Windows自动运行任务 390 10.14 在Windows创建共享 391 10.15 连接一个正在运行的Internet Explorer实例 392 10.16 读取Microsoft Outlook Contacts 393 10.17 在Mac OS X收集详细的系统信息 396 第11章 用户界面 400 引言 400 11.1 在文本控制台显示进度条 402 11.2 避免在编写回调函数时使用lambda 404 11.3 在tkSimpleDialog函数使用默认值和区间 405 11.4 给Tkinter列表框增加拖曳排序能力 406 11.5 在Tkinter部件输入一个重音字符 408 11.6 在Tkinter嵌入内联的GIF 410 11.7 转换图片格式 412 11.8 在Tkinter实现一个秒表 415 11.9 用线程实现GUI和异步I/O 的结合 417 11.10 在Tkinter使用IDLE的 Tree部件 421 11.11 在Tkinter Listbox支持单行多值 423 11.12 在Tkinter部件之间复制Geometry方法和选项 427 11.13 在Tkinter实现一个带标签的记事本 429 11.14 使用wxPython实现带面板的记事本 431 11.15 在Jython实现一个ImageJ插件 433 11.16 用Swing和Jython来通过URL查看图片 434 11.17 在Mac OS获得用户输入 434 11.18 程序化地创建Python Cocoa GUI 437 11.19 用IronPython实现淡入窗口 439 第12章 XML处理 441 引言 441 12.1 检查XML的格式完好性 443 12.2 计算文档标签的个数 444 12.3 获得XML文档文本 445 12.4 自动探测XML的编码 447 12.5 将一个XML文档转化成Python对象树 449 12.6 从XML DOM节点的子树删除仅有空白符的文本节点 451 12.7 解析Microsoft Excel的XML 452 12.8 验证XML文档 454 12.9 过滤属于指定命名空间的元素和属性 455 12.10 用SAX合并连续的文本事件 458 12.11 使用MSHTML来解析XML或HTML 461 第13章 网络编程 462 引言 462 13.1 通过Socket数据报传输消息 464 13.2 从Web抓取文档 466 13.3 过滤FTP站点列表 467 13.4 通过SNTP协议从服务器获取时间 468 13.5 发送HTML邮件 469 13.6 在MIME消息绑入文件 471 13.7 拆解一个分段MIME消息 474 13.8 删除邮件消息的附件 475 13.9 修复Python 2.4的email.FeedParser 解析的消息 477 13.10 交互式地检查POP3邮箱 479 13.11 探测不活动的计算机 482 13.12 用HTTP监视网络 487 13.13 网络端口的转发和重定向 489 13.14 通过代理建立SSL隧道 492 13.15 实现动态IP协议 495 13.16 登录到IRC并将消息记录到磁盘 498 13.17 访问LDAP服务 500 第14章 Web编程 502 引言 502 14.1 测试CGI是否在工作 503 14.2 用CGI脚本处理URL 506 14.3 用CGI上传文件 507 14.4 检查web页面的存在 509 14.5 通过HTTP检查内容类型 510 14.6 续传HTTP下载文件 512 14.7 抓取Web页面时处理Cookie 513 14.8 通过带身份验证的代理进行HTTPS导航 516 14.9 用Jython实现Servlet 517 14.10 寻找Internet Explorer的cookie 519 14.11 生成OPML文件 521 14.12 聚合RSS Feed 524 14.13 通过模板将数据放入Web页面 527 14.14 在Nevow呈现任意对象 530 第15章 分布式编程 534 引言 534 15.1 实现一个XML-RPC方法调用 536 15.2 服务XML-RPC请求 537 15.3 在Medusa使用XML-RPC 539 15.4 允许XML-RPC服务被远程终止 541 15.5 SimpleXMLRPCServer的一些细节 542 15.6 给一个XML-RPC服务提供一个wxPython GUI 544 15.7 使用Twisted的Perspective Broker 546 15.8 实现一个CORBA服务和客户 549 15.9 使用telnetlib执行远程登录 551 15.10 使用SSH执行远程登录 554 15.11 通过HTTPS验证一个SSL客户端 557 第16章 关于程序的程序 559 引言 559 16.1 验证字符是否代表着一个合法的数字 564 16.2 导入一个动态生成的模块 565 16.3 导入一个名字在运行时被确定的模块 567 16.4 将参数和函数联系起来 568 16.5 组合函数 571 16.6 使用内建的Tokenizer给Python源码上色 572 16.7 合并和拆解Token 575 16.8 检查字符是否有平衡的圆括号 577 16.9 在Python模拟枚举 580 16.10 在创建列表推导时引用它自身 583 16.11 自动化py2exe将脚本编译成Windows可执行文件的过程 585 16.12 在UNIX将主脚本和模块绑成一个可执行文件 587 第17章 扩展和嵌入 590 引言 590 17.1 实现一个简单的扩展类型 592 17.2 用Pyrex实现一个简单的扩展类型 597 17.3 在Python使用C++库 598 17.4 调用Windows DLL的函数 601 17.5 在多线程环境使用SWIG生成的模块 603 17.6 用PySequence_Fast将Python序列转为 C数组 604 17.7 用迭代器逐个访问Python序列的元素 608 17.8 从Python可调用的C函数返回None 611 17.9 用gdb调试动态载入的C扩展 613 17.10 调试内存问题 614 第18章 算法 616 引言 616 18.1 消除序列的重复 619 18.2 在保留序列顺序的前提下消除其的重复 621 18.3 生成回置采样 625 18.4 生成无回置的抽样 626 18.5 缓存函数的返回值 627 18.6 实现一个FIFO容器 629 18.7 使用FIFO策略来缓存对象 631 18.8 实现一个Bag(Multiset)收集类型 634 18.9 在Python模拟三元操作符 637 18.10 计算素数 640 18.11 将整数格式化为二进制字符 642 18.12 以任意数为基将整数格式化为字符 644 18.13 通过法雷分数将数字转成有理数 646 18.14 带误差传递的数学计算 648 18.15 以最大精度求和 651 18.16 模拟浮点数 653 18.17 计算二维点集的凸包和直径 656 第19章 迭代器和生成器 660 引言 660 19.1 编写一个类似range的浮点数递增的函数 663 19.2 从任意可迭代对象创建列表 665 19.3 生成Fibonacci序列 667 19.4 在多重赋值拆解部分项 669 19.5 自动拆解出需要的数目的项 670 19.6 以步长n将一个可迭代对象切成n片 672 19.7 通过重叠窗口循环序列 674 19.8 并行地循环多个可迭代对象 678 19.9 循环多个可迭代对象的矢量积 680 19.10 逐段读取文本文件 683 19.11 读取带有延续符的行 685 19.12 将一个数据块流处理成行流 687 19.13 用生成器从数据库抓取大记录集 688 19.14 合并有序序列 690 19.15 生成排列、组合以及选择 694 19.16 生成整数的划分 696 19.17 复制迭代器 697 19.18 迭代器的前瞻 701 19.19 简化队列消费者线程 703 19.20 在另一个线程运行迭代器 705 19.21 用itertools.groupby来计算汇总报告 706 第20章 描述符、装饰器和元类 710 引言 710 20.1 在函数调用获得常新的默认值 712 20.2 用嵌套函数来编写property属性 715 20.3 给属性值起别名 717 20.4 缓存属性值 719 20.5 用同一个方法访问多个属性 722 20.6 封装一个方法来给类增加功能 723 20.7 增强所有方法来给类增加功能 726 20.8 在运行时给一个类实例添加方法 728 20.9 检查接口的实现 730 20.10 在自定义元类正确地使用_ _new_ _和_ _init_ _ 732 20.11 允许对List的可变方法的链式调用 734 20.12 通过更紧凑的语法使用协作的超类调用 736 20.13 不使用_ _init_ _来初始化实例属性 738 20.14 实例属性的自动初始化 740 20.15 重新加载时自动更新类实例 743 20.16 在编译时绑定常量 747 20.17 解决元类冲突 752

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧