免责声明:此问题已重做,因此评论和答案可能看起来无关。我很抱歉,但这样做是出于一个更清晰,结构更好的问题。
假设给定的字符串要在其中找到两个不同的组(名称), 其中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+)*'
。
答案 0 :(得分:0)
我做了两个更改:我将搜索锚定在单词的开头,并将您的第一个断言转换为后向。我在Notepad ++中尝试过(这里没有Python),它适用于示例
\b(?<!\[)[a-wzA-Z_0-9]+(?!\])
我希望您的公式具有一致的间距...
答案 1 :(得分:0)
使用双Application.CalculationState
会很好。
findall
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))
或*
结尾/
开头[
结尾