python - 正则表达式:如何查找括号内的字符 *except*

标签 python regex

我正在解析一些输入文本,需要将除一组已识别的允许字符之外的所有字符都标记为非法,除非这些字符出现在一对括号中。实际上,括号应该保护非法字符不被捕获。

在 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/

相关文章:

python - Dask.distributed 每个节点仅使用一个核心

Python Dash 不使用 js 的外部 URL

python - 替换列表中的字符串值

python - Graphite 烯 : Enum argument doesn't seem to work

java - 是否可以计算正则表达式前瞻的字符数?

php - 如何在大量数据中preg_replace_all

python - 将 facebook 登录与 python 集成到 google 应用引擎中

c++ - 有条件地替换字符串中的正则表达式匹配

javascript - JavaScript 正则表达式中的非捕获组匹配空白边界

c# - Ef-Core - 我可以使用什么正则表达式在 Db 拦截器中用 nolock 替换表名