我正在解析一些输入文本,并且除了除之外,还需要将除识别的一组允许字符之外的所有字符标记为非法,当这些字符出现在一对parantheses中时。实际上,parantheses应该保护非法人物不被抓住。
在SO搜索结果中,我发现这是唯一类似的搜索结果:Find nth character except if its enclosed in brackets php但我不知道如何根据我的情况进行调整。
例如,如何构造一个正则表达式来标记所有非字母(例如[^a-z]
)字符,除非它们出现在parantheses中(显然这些parantheses本身是合法的)?
答案 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()]+)
参考