【发布时间】:2019-03-30 21:15:39
【问题描述】:
我有一些句子和一个正则表达式。是否有可能找出我的句子满足正则表达式的位置。例如,将我的句子视为MMMV,将正则表达式视为M+V?T*Z+。现在正则表达式直到 M+V? 满足句子,正则表达式的剩余部分是 T*Z+ 这应该是我的输出。
我现在的方法是将正则表达式分解为单个部分并将其存储在一个列表中,然后通过连接前 n 个部分进行匹配,直到句子匹配。例如,如果我的正则表达式是M+V?T*Z+,那么我的列表就是['M+', 'V?', 'T*', 'Z+']。然后我首先在循环中匹配我的字符串M+,其次是M+V?,依此类推,直到找到完全匹配,然后将剩余的列表作为输出。下面是代码
re_exp = ['M+', 'V?', 'T*', 'Z+']
for n in range(len(re_exp)):
re_expression = ''.join(re_exp[:n+1])
if re.match(r'{0}$'.format(re_expression), sentence_language):
return re_exp[n+1:]
是否有更好的方法来实现这一点可能是通过使用一些解析库等。
【问题讨论】:
-
正则表达式有多复杂?它可以有组、字符组、反向引用、前瞻等吗?
-
如果正则表达式非常简单,如您的示例所示,您可能甚至可以编写一个非常简单的自定义正则表达式解析器/匹配器。特别是如果正则表达式的连续部分处理不同的字符(例如,没有
V?V+),那么这甚至应该贪婪地工作,没有任何回溯。 -
正则表达式很简单。但我在编写自定义函数时唯一考虑的是随着正则表达式大小的增加,速度差异和最终情况的处理。如果我可以调整
re本身以获取输出或使用其他解析库会很有帮助 -
也许,不是连接正则表达式的部分然后匹配整个字符串,您可以只匹配一个部分,然后将下一部分匹配到字符串的其余部分,即切掉匹配的前缀正则表达式的第一个“术语”。
-
如果一个字符串匹配
M+V?,那么它也匹配M+V?T*,因为T*可以匹配零个字符。所以很难看出假设的部分匹配器如何将M+V?报告为部分匹配。