我正在解析一些输入文本,需要将除一组已识别的允许字符之外的所有字符都标记为非法,除非这些字符出现在一对括号中。实际上,括号应该保护非法字符不被捕获。
在 SO 搜索结果中,我发现这是唯一相似的:Find nth character except if its enclosed in brackets php但我不确定如何使它适应我的情况。
例如,如何构建一个正则表达式来标记所有非字母(例如 [^a-z]
)字符,除非它们出现在括号内(显然括号本身是合法的)?
最佳答案
让我们使用您的示例:
how to construct a regex to flag all non-alphabetic (say [^a-z]) characters except when they occur within parantheses
这个问题是这个问题中解释的技术的经典案例 "regex-match a pattern, excluding..."
我们可以考虑两个选项,具体取决于括号是否可以嵌套。
选项 1:无嵌套
我们可以使用这个简单的正则表达式:
\([^)]*\)|([^a-z()]+)
交替的左侧 |
匹配完整的 (括号)
。我们将忽略这些匹配项。右侧将违规字符匹配并捕获到第 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 的 Python regex
模块,在 |
的左侧替换此递归正则表达式以匹配括号: \((?:[^()]++|(?R))*\)
。因此,整个正则表达式变为:
\((?:[^()]++|(?R))*\)|([^a-z()]+)
引用
关于python - 正则表达式:如何查找括号内的字符 *except*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24597126/