2009-10-11 21 views
0

我有一个正则表达式,工作得很好(虽然我相信这是弱)的.NET/C#:正则表达式从.NET到Python

((^|\s))(?<tag>\@(?<tagname>(\w|\+)+))(?($|\s|\.)) 

我试图将其移动到Python,但我似乎遇到格式问题(无效的表达式异常)。

这是一个蹩脚的问题/要求,但我一直盯着这一段时间,但没有什么明显的是跳出来对我。

注:我只是想

r = re.compile('((^|\s))(?<tag>\@(?<tagname>(\w|\+)+))(?($|\s|\.))') 

感谢, 斯科特

+0

你能解释你为什么要做/...(((...))/?如果我没有记错,(?)是一个非捕获组,然后你在做()捕获,我是否错过了什么? – 2009-10-11 03:11:39

+0

事实上,根据我发现的文档,'(?:)'是一个非捕获组。 '(?)'甚至不存在。 – 2009-10-11 03:20:07

回答

1

有.NET正则表达式和PCRE/Python的正则表达式之间的一些语法不兼容:

  • (?<name>...)(?P<name>...)
  • (?...)不存在,和我不知道它是干什么用的英寸NET我猜不出任何等价物。谷歌的codesearch没有给我任何指示它可以用于什么。

此外,你应该表达正则表达式时使用Python原始字符串(r"I am a raw string"),而不是正常的字符串:原始字符串不解释转义序列(如\n)。但是在你的例子中这不是问题,因为你没有使用任何已知的可以被替换的转义序列(\s并不意味着什么作为转义序列,所以它不被替换)。

0

是 “(?”,以防止有一个单独的组的创建在Python的重的,这是什么? “(?”试试这个:

r = re.compile(r'((^|\s))(:?<tag>\@(:?<tagname>(\w|\+)+))(:?($|\s|\.))') 

另外,还要注意使用原始字符串字面量(以下简称“R”字就在报价前)原文字抑制'\'逃逸,让你的'\'个字符通过直通(否则,每'\'需要'\\')。

+1

.net中的非捕获组是(?:) – 2009-10-11 03:08:38

+0

原始字符串上的提示非常有用。正如Delroth提到的,主要问题涉及到?P 而不是? 2009-10-11 03:44:51