如何在正则表达式中指定不匹配的内容

时间:2018-10-22 18:01:13

标签: 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,但出于问题的目的,我允许 就是比赛。

为澄清起见,该问题旨在寻求表示“忽略匹配{序列}” 在正则表达式中,并知道是否有可能以“仅满足条件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+)*'

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

使用双Application.CalculationState会很好。

findall
  1. 第1组
    • \ w +匹配非字母数字字符,但不包括“ _”
    • (?= * | /)字符串以import re a = "rho_1 * x + R * [np.R] + rho_1 / x + R * [np.R]" print(re.findall(r"\w+(?= \*| \/)",a)) print(re.findall("(?<=\[).*?(?=\])",a)) *结尾
  2. 第2组
    • (?<= [)以/开头
    • 。*?尽可能少地匹配任何字符
    • (?=])以[结尾