转换C++ Boost正则表达式到Python RE正则表达式

2024-10-03 23:26:31 发布

您现在位置:Python中文网/ 问答频道 /正文

目的是将C++boost中的正则表达式转换为Pythonre正则表达式:

  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,但是上面的例子还有很多,所以我的问题是关于

    >强>如何将C++ Boost ReGeExest+Python < /St>和转换
  • boost regex和python re regex有什么区别?
< P><强> > Python中的C++ {{CD5>}与^ {CD4>}正则表达式相同吗?如果没有,有什么区别?(链接到文档将非常感谢=))例如:

  • 在boost中,有boost::u32regex_match,与 re.match?在
  • 在boost中,有boost::u32regex_search,它与re.search有什么不同
  • 还有boost::format_perl和{}和{},它们在{}re中的等价性是什么?在

Tags: 目的researchmakematchregexboost区别
1条回答
网友
1楼 · 发布于 2024-10-03 23:26:31

How to convert C++ boost regexest to Python

对于简单的regex,比如\w+\s+\d+,或者{},您不必更改模式。如果有更复杂的模式和下面提到的构造,您很可能需要重新编写一个regex。与从一种口味/语言到另一种口味/语言的任何转换一样,一般的答案是不要。然而,Python和Boost确实有一些相似之处,特别是当涉及到包含点(a.*b)、正则([\w-]*)和反([^>]*)字符类的简单模式(如果Boost使用的是类PCRE的模式),正则量词如+/*/?等。在

what is the difference between boost regexes and python re regexes?

Python ^{} module没有Boost regexps那么丰富(只要提到^{}, ^{}, ^{}, ^{}, ^{}, ^{}, branch reset, recursion, possessive quantifiers, POSIX character classes and character propertiesextended replacement pattern)和Boost所具有的其他特性就足够了。(?imsx-imsx:pattern)仅限于Python中的整个表达式,而不是其中的一部分,因此您应该注意,&amp;|&#((?i)x26);|&#38;中的(?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+(支持原始字符串字面值)是一个很好的候选者。在

至于剩下的问题:

in boost, there's boost::u32regex_match, is that the same as re.match?

^{}与regex_match不同,因为re.match在字符串的开头查找匹配,而^{}需要一个完整的字符串匹配。但是,在python3中,可以使用与Boost^{cd29>}等效的^{}。在

in boost, there's boost::u32regex_search, how is it different to re.search

当您需要在字符串中的任何地方找到匹配项时,您需要使用re.search(请参见^{} versus ^{})。因此,此方法提供了类似于^{}在Boost中所做的功能。在

there's also boost::format_perl and boost::match_default and boost::smatch, what are their equivalence in python re?

Python在Boost can的范围内不支持类Perl的表达式,Python re模块只是一个“修剪”的Perl regex引擎,它没有我前面提到的许多好特性。因此,在那里找不到default或{}这样的标志。至于smatch,可以使用^{}来获得所有的{a15}。^{}以字符串/元组列表的形式返回所有匹配项(或仅当指定了捕获组时才返回子匹配项)。参见^{}/^{} difference。在

最后,是一篇必须阅读的文章Python’s re Module。在

相关问题 更多 >