Python 正则表达式:如何找到一个字符*除非*在Paranthese中

Python 正则表达式:如何找到一个字符*除非*在Paranthese中,python,regex,Python,Regex,我正在解析一些输入文本,需要将除一组可识别的允许字符外的所有字符标记为非法,除非这些字符出现在一对偏执字符中。实际上,偏执狂应该保护非法角色不被抓获 在这么多的搜索结果中,我发现这是唯一一个相似的:但我不知道如何使其适应我的情况 例如,如何构造一个正则表达式来标记所有非字母字符,例如[^a-z]字符,除非它们出现在parantheses中。显然,parantheses本身是合法的?让我们使用您的示例: 如何构造正则表达式来标记所有非字母,例如[^a-z] 字符,除非出现在偏执中 这个问题是本问题

我正在解析一些输入文本,需要将除一组可识别的允许字符外的所有字符标记为非法,除非这些字符出现在一对偏执字符中。实际上,偏执狂应该保护非法角色不被抓获

在这么多的搜索结果中,我发现这是唯一一个相似的:但我不知道如何使其适应我的情况


例如,如何构造一个正则表达式来标记所有非字母字符,例如[^a-z]字符,除非它们出现在parantheses中。显然,parantheses本身是合法的?

让我们使用您的示例:

如何构造正则表达式来标记所有非字母,例如[^a-z] 字符,除非出现在偏执中

这个问题是本问题中解释的技术的一个经典案例

我们可以看两个选项,这取决于括号是否可以嵌套

选项1:无嵌套

我们可以使用这个简单的正则表达式:

\([^)]*\)|([^a-z()]+)
交替的左侧匹配完整的括号。我们将忽略这些匹配。右侧匹配并捕获第1组中有问题的角色,我们知道它们是右侧角色,因为它们与左侧的表达式不匹配

此程序显示了如何使用正则表达式。请参见以下列表底部的结果:

选项2:嵌套括号

如果出于任何原因可以嵌套括号,请使用Matthew Barnett的Python正则表达式模块,替换|左侧的这个递归正则表达式以匹配括号:\?:[^]+| R*\。因此,整个正则表达式变为:

\((?:[^()]++|(?R))*\)|([^a-z()]+)
参考文献


让我们使用您的示例:

如何构造正则表达式来标记所有非字母,例如[^a-z] 字符,除非出现在偏执中

这个问题是本问题中解释的技术的一个经典案例

我们可以看两个选项,这取决于括号是否可以嵌套

选项1:无嵌套

我们可以使用这个简单的正则表达式:

\([^)]*\)|([^a-z()]+)
交替的左侧匹配完整的括号。我们将忽略这些匹配。右侧匹配并捕获第1组中有问题的角色,我们知道它们是右侧角色,因为它们与左侧的表达式不匹配

此程序显示了如何使用正则表达式。请参见以下列表底部的结果:

选项2:嵌套括号

如果出于任何原因可以嵌套括号,请使用Matthew Barnett的Python正则表达式模块,替换|左侧的这个递归正则表达式以匹配括号:\?:[^]+| R*\。因此,整个正则表达式变为:

\((?:[^()]++|(?R))*\)|([^a-z()]+)
参考文献


举个例子会更好。使用Python正则表达式可以实现一个只有正则表达式的解决方案。如果括号不能嵌套并且总是正确平衡的话。您的输入就是这样吗?@TimPietzcker您可能已经知道这一点,但是使用正则表达式模块而不是re,我们还可以匹配嵌套括号,因为它支持递归:举个例子会更好。使用Python正则表达式可以实现一个只有正则表达式的解决方案。如果括号不能嵌套并且总是正确平衡的话。您的输入就是这样吗?@TimPietzcker您可能已经知道这一点,但是使用正则表达式模块而不是re,我们还可以匹配嵌套括号,因为它支持递归:@阿努巴瓦谢谢你您是对的,这种语法在PCRE和Perl中工作,但是,为了澄清您是否遗漏了这一点,这里我将讨论在Python中使用它,这要感谢漂亮的正则表达式模块。我读了你的推荐信,尤其是你在第一封信中给出的长答案。我最初只想测试re.matchillegalCatcher,string是否可以使用look?:ahead | behinds!-你会说即使使用较新的正则表达式模块也不可能做到这一点,还是说这不切实际?很高兴这有帮助,jamadagni如果您想要匹配这些非法字符,除非在特定的上下文中,那么这是迄今为止最可靠的解决方案。当然,您可以使用先行检查来检查非法字符后面没有非par+结束par:?![^ ]但是,这并不保证在你的非法炭的左边有一个开放的标准。还有一个黑客检查非法字符右侧的PAR数是否为偶数。。。但同样的缺陷。没有一种方法总是完美的,你来选择吧!:@阿努巴瓦谢谢你您是对的,这种语法在PCRE和Perl中工作,但是,为了澄清您是否遗漏了这一点,这里我将讨论在Python中使用它,这要感谢漂亮的正则表达式模块。我读了你的推荐信,尤其是你在第一封信中给出的长答案。我最初只想测试re.matchillegalCatcher,string是否可以实现
如何使用look?:前方|后方!-你会说即使使用较新的正则表达式模块也不可能做到这一点,还是说这不切实际?很高兴这有帮助,jamadagni如果您想要匹配这些非法字符,除非在特定的上下文中,那么这是迄今为止最可靠的解决方案。当然,您可以使用先行检查来检查非法字符后面没有非par+结束par:?![^ ]但是,这并不保证在你的非法炭的左边有一个开放的标准。还有一个黑客检查非法字符右侧的PAR数是否为偶数。。。但同样的缺陷。没有一种方法总是完美的,你来选择吧!: