正则表达式:如何在括号内找到*以外的字符*

时间:2014-07-06 14:56:52

标签: python regex

我正在解析一些输入文本,并且除了之外,还需要将除识别的一组允许字符之外的所有字符标记为非法,当这些字符出现在一对parantheses中时。实际上,parantheses应该保护非法人物不被抓住。

在SO搜索结果中,我发现这是唯一类似的搜索结果:Find nth character except if its enclosed in brackets php但我不知道如何根据我的情况进行调整。

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

1 个答案:

答案 0 :(得分:4)

让我们使用你的例子:

  

如何构造一个正则表达式来标记所有非字母(例如[^ a-z])   除了在parantheses中出现的字符

此问题是此问题中向"regex-match a pattern, excluding..."

解释的技术的典型案例

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

选项1:无嵌套

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

\([^)]*\)|([^a-z()]+)

交替|的左侧匹配完成(parentheses)。我们将忽略这些匹配。右侧匹配并捕获第1组的违规字符,我们知道它们是正确的,因为它们与左侧的表达不匹配。

此程序显示了如何使用正则表达式(请参阅online demo底部的结果):

import re
subject = '[]{}&&& ThisIs(OK)'
regex = re.compile(r'\([^)]*\)|([^a-z()]+)')
# put Group 1 captures in a list
matches = [group for group in re.findall(regex, subject) if group]

print("\n" + "*** Matches ***")
if len(matches)>0:
for match in matches:
print (match)

选项2:嵌套括号

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

\((?:[^()]++|(?R))*\)|([^a-z()]+)

参考