目的是将C++
boost
中的正则表达式转换为Python
re
正则表达式:
typedef boost::u32regex tRegex;
tRegex emptyre = boost::make_u32regex("^$");
tRegex commentre = boost::make_u32regex("^;.*$");
tRegex versionre = boost::make_u32regex("^@\\$Date: (.*) \\$$");
tRegex includere = boost::make_u32regex("^<(\\S+)$");
tRegex rungroupre = boost::make_u32regex("^>(\\d+)$");
tRegex readreppre = boost::make_u32regex("^>(\\S+)$");
tRegex tokre = boost::make_u32regex("^:(.*)$");
tRegex groupstartre = boost::make_u32regex("^#(\\d+)$");
tRegex groupendre = boost::make_u32regex("^#$");
tRegex rulere = boost::make_u32regex("^([!-+^])([^\\t]+)\\t+([^\\t]*)$");
我可以逐个重写这些regex,但是上面的例子还有很多,所以我的问题是关于
boost::u32regex_match
,与
re.match
?在boost::u32regex_search
,它与re.search
有什么不同boost::format_perl
和{re
中的等价性是什么?在
对于简单的regex,比如},您不必更改模式。如果有更复杂的模式和下面提到的构造,您很可能需要重新编写一个regex。与从一种口味/语言到另一种口味/语言的任何转换一样,一般的答案是不要。然而,Python和Boost确实有一些相似之处,特别是当涉及到包含点(
\w+\s+\d+
,或者{a.*b
)、正则([\w-]*
)和反([^>]*
)字符类的简单模式(如果Boost使用的是类PCRE的模式),正则量词如+
/*
/?
等。在Python ^{} module 没有Boost regexps那么丰富(只要提到^{}, ^{}, ^{}, ^{}, ^{}, ^{}, branch reset, recursion, possessive quantifiers, POSIX character classes and character properties ,extended replacement pattern)和Boost所具有的其他特性就足够了。
(?imsx-imsx:pattern)
仅限于Python中的整个表达式,而不是其中的一部分,因此您应该注意,&|&#((?i)x26);|&
中的(?i)
将被视为模式的开头(但是,它对该表达式没有任何影响)。在另外,与Boost中的一样,您不必在字符类内转义
[
,而在字符类之外转义{
。在像
\1
这样的反向引用与Python中的相同。在由于您没有在模式中交替使用捕捉组(例如
re.sub(r'\d(\w)|(go\w*)', '\2', 'goon')
),所以应该没有问题(在这种情况下,Python不会用任何值填充非参与组,并且返回一个空结果)。在注意命名组定义的区别:Boost中的
(?<NAME>expression)
/(?'NAME'expression)
,Python中的(?P<NAME>expression)
。在我看到你的regexp主要属于“简单”类。最复杂的模式是tempered greedy token(例如
⌊-((?:(?!-⌋).)*)-⌋
)。为了优化它们,您可以使用unroll the loop技术,但根据处理表达式的文本大小,这可能不是必需的。在在我看来,最麻烦的部分是您大量使用Unicode文本。在python2.x中,所有的字符串都是字节数组,您必须始终确保将unicode对象传递给unicode regexp(请参见Python 2.x’s Unicode Support)。在python3中,默认情况下所有字符串都是UTF8,您甚至可以在源代码中使用UTF8文本字符,而无需任何附加操作(请参见Python’s Unicode Support)。因此,python3.3+(支持原始字符串字面值)是一个很好的候选者。在
至于剩下的问题:
^{} 与regex_match不同,因为} 需要一个完整的字符串匹配。但是,在python3中,可以使用与Boost^{cd29>}等效的^{} 。在
re.match
在字符串的开头查找匹配,而^{当您需要在字符串中的任何地方找到匹配项时,您需要使用} versus ^{} )。因此,此方法提供了类似于^{} 在Boost中所做的功能。在
re.search
(请参见^{Python在Boost can的范围内不支持类Perl的表达式,Python}这样的标志。至于} 来获得所有的{a15}。^{} 以字符串/元组列表的形式返回所有匹配项(或仅当指定了捕获组时才返回子匹配项)。参见^{}/^{} difference 。在
re
模块只是一个“修剪”的Perl regex引擎,它没有我前面提到的许多好特性。因此,在那里找不到default
或{smatch
,可以使用^{最后,是一篇必须阅读的文章Python’s re Module。在
相关问题 更多 >
编程相关推荐