gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:34:04 26 4
gpt4 key购买 nike

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com