<p>如果您想用一个regex来处理它,您可能需要使用PyPi<code>regex</code>模块:</p>
<pre><code>import regex
s = """{{ product.id }}
{{ product.parentProductId }}
{{ product.countdown.startDate | date('Y/m/d H:i:s') }}
{{ product.primaryImage.originalUrl }}
{{ product.image(1).originalUrl }}
{{ product.priceWithTax(preferences.default_currency) | money }}"""
rx = r'{{[^{}]*product(\.[a-zA-Z]+(?:\([^()]+\))?)*[^{}]*}}'
l = [m.captures(1) for m in regex.finditer(rx, s)]
print([item for sublist in l for item in sublist])
# => ['.id', '.parentProductId', '.countdown', '.startDate', '.primaryImage', '.originalUrl', '.image(1)', '.originalUrl', '.priceWithTax(preferences.default_currency)']
</code></pre>
<p>参见<a href="http://rextester.com/ODUPD48571" rel="nofollow noreferrer">Python demo</a></p>
<p><code>{{[^{}]*product(\.[a-zA-Z]+(?:\([^()]+\))?)*[^{}]*}}</code>正则表达式将匹配</p>
<ul>
<li><code>{{</code>-<code>{{</code>子串</li>
<li><code>[^{}]*</code>-0+除<code>{</code>和<code>}</code>以外的字符</li>
<li><code>product</code>-子串<code>product</code></li>
<li><code>(\.[a-zA-Z]+(?:\([^()]+\))?)*</code>-捕获组1:零个或多个
<ul>
<li><code>\.</code>-一个点</li>
<li><code>[a-zA-Z]+</code>-1+ASCII字母</li>
<li><code>(?:\([^()]+\))?</code>—可选的<code>(</code>、除<code>(</code>和<code>)</code>之外的1+字符序列,然后是<code>)</code></li>
</ul></li>
<li><code>[^{}]*</code>-0+除<code>{</code>和<code>}</code>以外的字符</li>
<li><code>}}</code>-a<code>}}</code>子串</李>
</ul>
<p>如果仅限于<code>re</code>,则需要将所有属性捕获到一个捕获组中(将此<code>(\.[a-zA-Z]+(?:\([^()]+\))?)*</code>包装为<code>(...)</code>),然后运行基于regex的post进程,按<code>.</code>而不是括号内进行拆分:</p>
<pre><code>import re
rx = r'{{[^{}]*product((?:\.[a-zA-Z]+(?:\([^()]+\))?)*)[^{}]*}}'
l = re.findall(rx, s)
res = []
for m in l:
res.extend([".{}".format(n) for n in filter(None, re.split(r'\.(?![^()]*\))', m))])
print(res)
# => ['.id', '.parentProductId', '.countdown', '.startDate', '.primaryImage', '.originalUrl', '.image(1)', '.originalUrl', '.priceWithTax(preferences.default_currency)']
</code></pre>
<p>见<a href="http://rextester.com/FZKX9931" rel="nofollow noreferrer">this Python demo</a></p>