擅长:python、mysql、java
<p>我认为您的代码有很多问题(例如不需要外包装列表和将字符串拆分为列表),所以我在这里重写了它。您只需要在列表上递归,为“or”追加“|”,并为所有其他情况追加字符串。你知道吗</p>
<pre><code>def buildRegex(request):
result = '('
for x in request:
if not isinstance(x, str):
result += buildRegex(x)
elif x == 'or':
result += '|'
else:
result += x
result += ')'
return result
inp = [['mirna', 'or', 'microrna'], 'or', 'lala']
print(buildRegex(inp))
inp = [['mirna', 'or', ['hello', 'or', 'microrna']], 'or', ['lala', 'or','lele']]
print(buildRegex(inp))
</code></pre>
<p>输出:</p>
<pre><code>((mirna|microrna)|lala)
((mirna|(hello|microrna))|(lala|lele))
</code></pre>
<p>编辑:这里有一个版本的列表理解只是为了好玩。但在我看来,它的可读性较差:</p>
<pre><code>def buildRegex(request):
return '(' + ''.join([buildRegex(x) if isinstance(x, list) else '|' if x == 'or' else x for x in request]) + ')'
</code></pre>
<p>编辑:正如弗朗西斯科指出的(不确定他为什么删除了他的评论),用<code>result += re.escape(x)</code>替换<code>result += x</code>可能是一个好主意,这样您就可以直接在字符串中使用像“|”这样的字符。你知道吗</p>