2

我有一个带有 mysql 结构转储的字符串。

...
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `contig`
--

DROP TABLE IF EXISTS `contig`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `contig` (
  `id` int(10) NOT NULL,
  `seq` varchar(1000) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_c
..

现在我想选择每个包含创建表查询的字符串。我尝试re.findall了几个正则表达式(例如(CREATE TABLE)(.*)[^;]*

但是我尝试过的每个正则表达式充其量都返回了[('CREATE TABLE', " 'contig' (")]。但我希望整个查询作为列表中的一个元素。我试图rstrip删除断线,但没有任何效果。

如何将每个 INSERT INTO 查询作为一个整体?

4

1 回答 1

4

您不能使用正则表达式选择嵌套括号序列。因此,您要执行的任务是无法解决的。

但作为一个黑客,你可以尝试这样的事情:

>>> re.findall('CREATE TABLE[^;]+;', s)
['CREATE TABLE `contig` (...) ENGINE=InnoDB DEFAULT CHARSET=latin1;']

部分(.*)在你的正则表达式中是多余的。

于 2012-10-11T22:02:59.827 回答