Python 找出正则表达式满足句子的地方
我有一些句子和一个正则表达式。有没有可能知道我的句子在正则表达式中的什么地方满足了。例如,把我的句子看作是<代码> MMMV 和正则表达式>代码> M+V.T*Z+。现在regex-tillPython 找出正则表达式满足句子的地方,python,regex,parsing,Python,Regex,Parsing,我有一些句子和一个正则表达式。有没有可能知道我的句子在正则表达式中的什么地方满足了。例如,把我的句子看作是 MMMV 和正则表达式>代码> M+V.T*Z+。现在regex-tillM+V?满足句子,regex的剩余部分是T*Z+,应该是我的输出 我现在的方法是将正则表达式分解为各个部分,并将其存储在一个列表中,然后通过连接前n个部分进行匹配,直到句子匹配为止。例如,如果我的正则表达式是M+V?T*Z+,那么我的列表就是['M+'、'V?'、'T*'、'Z+]。然后,我首先通过M+匹配循环中的字
M+V?
满足句子,regex的剩余部分是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:]
是否有更好的方法来实现这一点,可以使用一些解析库等。您可以使用()
将组括在正则表达式中。例如:M+V?(T*Z+
,所需的输出存储在正则表达式的第一组中
我知道问题的答案是python,但在这里,您可以看到regex正在运行:
const regex=/M+V?(T*Z+)/;
常量str=`MMMVTZ`;
设m=regex.exec(str);
console.log(m[1])代码>假设您的正则表达式非常简单,没有组、反向引用、lookahead等,例如,在您的案例中,按照模式\w[+*?]?
,您可以首先将其拆分为多个部分,就像您已经做的那样。但是,您可以通过切掉已经匹配的部分来单独测试每个部分,而不是迭代地连接这些部分并将它们与整个字符串进行匹配
def match(pattern, string):
res = pat = ""
for p in re.findall(r"\w[+*?]?", pattern):
m = re.match(p, string)
if m:
g = m.group()
string = string[len(g):]
res, pat = res + g, pat + p
else:
break
return pat, res
例如:
>>> for s in "MMMV", "MMVVTTZ", "MTTZZZ", "MVZZZ", "MVTZX":
>>> print(*match("M+V?T*Z+", s))
...
M+V?T* MMMV
M+V?T* MMV
M+V?T*Z+ MTTZZZ
M+V?T*Z+ MVZZZ
M+V?T*Z+ MVTZ
但是,请注意,在最坏的情况下,如果字符串的长度为n
且模式为n
部分,每个部分仅匹配一个字符,则仍有O(n²)用于重复分割字符串
此外,如果两个连续的部分大约是相同的字符,例如a?a+b
(应该相当于a+b
)将不匹配ab
,而只匹配aab
,因为单个a
已经被a
消耗掉了
通过为这种非常简化的正则表达式编写自己的非常简单的正则表达式匹配器,您可以将复杂性降低到O(n),但在一般情况下,这可能不值得,甚至更慢。这种方法的问题是我事先不知道()
会出现在哪里。这样想,我需要告诉用户在他/她输入了一些句子之后应该做什么。句子可以是MMM
,MMMV
等等。因此输出在每种情况下都会有所不同。正则表达式有多复杂?它可以有组、字符组、反向引用、lookahead等吗?如果正则表达式非常简单,比如在您的示例中,您甚至可以编写一个非常简单的自定义正则表达式解析器/匹配器。特别是如果正则表达式的连续部分处理不同的字符(例如noV?V+
),那么这甚至可以很好地工作,没有任何回溯。但在编写自定义函数时,我唯一要考虑的是,随着正则表达式大小的增加,速度的差异和对最终用例的处理。如果我可以调整re
本身以获得输出或使用其他解析库,这将是非常有用的。也许,您可以只匹配一部分,然后将下一部分与字符串的其余部分匹配,而不是连接正则表达式的部分,然后匹配整个字符串,也就是说,切掉匹配第一个“术语”的前缀如果字符串匹配M+V?
,那么它也匹配M+V?T*
,因为T*
可以匹配零个字符。因此,很难想象一个假设的部分匹配者会将M+V?
报告为部分匹配。