python - 如何指定正则表达式不匹配的内容

标签 python regex regex-negation

免责声明:此问题已重做,因此评论和答案可能看起来不相关。我很抱歉,但我这样做是为了提出一个更清晰、结构更好的问题。

假设给定的字符串我想在其中找到两个不同的组(名称), 其中 A 组满足条件 1,B 组满足条件 2 但也是条件 1。

举个例子:假设我有一个数学函数 -

'[class.parameterA] * numpy.exp( [x]*module.constantA - constant_B/[x] ) + [parameter_B]'

- 我控制参数的值,但不控制常量的值。 我想(通过使用 re.findall() )获得一组常量 和一组参数。

>>> group1
['numpy.exp', 'module.constantA', 'constant_B']
>>> group2
['class.parameterA', 'x', 'x', 'parameter_B']

我知道对于这个具体情况我不应该 匹配numpy.exp ,但为了问题的目的,我允许 这是一场比赛。

澄清一下,这个问题旨在寻求“忽略匹配{sequence}”的表示 在正则表达式中,并了解是否有可能以“仅满足条件 1”而不是“满足条件 1 且不满足条件 2”的方式解决问题,以便解决方案可以扩展到多个条件。 请提供一个部分抽象的答案(不是一个过于具体于此示例的答案)。

当然,过了一段时间,我只能为其中一个组找到部分解决方案(参见奖励),但非常欢迎任何其他明确的解决方案:

c1 = r'\w+\.?\w*' # forces alphanumeric variable structure
# c1 = r'[\w\.\(\)]*?' allows more freedom (can introduce function calls)
# at the cost of matching invalid names, like class..parameterA
c2 = r'(?<=\[)', r'(?=\])'

re_group2 = c2[0] + c1 + c2[1]

>>>> re.findall(re_group2, func)
['class.parameterA', 'x', 'x', 'parameter_B']

明显直观的括号否定不适用于 group1 ,但我可能介绍不正确:

c1 = r'\w+\.?\w*'
nc2 = r'(?<!\[\w)', r'(?!\w\])' # condition 2 negation approach

re_group1 = nc2[0] + c1 + nc2[1]

>>> re.findall(re_group1, func)
['class.parameterA', 'numpy.exp', 'x', 'module.constantA',
'constant_B', 'x', 'parameter_B']

奖金:如果有,比如说 module.submodule.constantA (超过 1 点),正则表达式将如何改变? 我想c1 = r'\w+(\.\w+)*' ,但它没有达到我的预期。编辑:我需要使用非捕获组,因为我正在使用 re.findall 。所以c1 = r'\w+(?:\.\w+)*' .

最佳答案

我做了两处更改:我将搜索锚定在单词的开头,并将您的第一个断言转换为后向断言。我在 Notepad++ 中尝试过(这里没有 Python),它适用于示例

\b(?<!\[)[a-wzA-Z_0-9]+(?!\])

我希望你的公式有一致的间距...

关于python - 如何指定正则表达式不匹配的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52935183/

相关文章:

用下划线替换两个大写字母之间的空格

javascript - 使用正则表达式从字符串中获取值

arrays - jq 负选择数组元素

python - opencv 设置相机分辨率 windows vs linux

python - 如何在Python中转换requests.models.Response对象中的dict对象?

python - Pandas 内存释放

javascript - 正则表达式在javascript中拉出方括号

php - 正则表达式:将除YouTube链接之外的所有链接与视频进行匹配

匹配 url 的正则表达式模式

python - 将列表表示为带有双引号的字符串,而不是 JSON 的单引号