繁体   English   中英

转换Javascript RegEx.exec将组匹配返回给Python

[英]Convert Javascript RegEx.exec which returns group matches to Python

我在Javascript中有以下代表性代码:

    NameRegEx = /\w+ \w+ (".*?"|\S+) (".*?"|\S+)/;
    term = NameRegEx.exec("add cmd item configname AAA 10.0.0.1 80 -option NONE -option2 YES -Option3 180");

这有效,并且“ term”是一个包含以下内容的数组:

0: "add cmd item configname"
1: "item"
2: "configname"

我无法在Python中找到与exec函数等效的函数,希望能提供一些帮助! 我也有许多类似的RegEx命令也需要转换,因此我需要一个替代的Python。

编辑:这与链接重复项不同,因为它们没有解决返回值如何不同的事实。 但是,Pushpesh Kumar Rajwanshi通过对正则表达式的以下修改和以下说明解决了该问题:

s = 'add cmd item configname AAA 10.0.0.1 80 -option NONE -option2 YES -Option3 180'
arr = [s for s in re.findall(r'(\w+ \w+ (".*?"|\S+) (".*?"|\S+))',s)[0]]
print(arr)

是的,需要附加的括号,因为您还希望在数组结果中也捕获完整的字符串。 否则,findall仅包含仅组的结果,如果没有组,则整个匹配。

重新打开,因为链接为重复的问题无法完全解决问题。

首先,感谢所有人都同意应该重新打开此帖子,因为链接的帖子对OP的需求没有帮助。

在回答时,我的主要目的是使解决方案与JS中的exec函数调用保持接近(而不是性能,这当然对search而不是findall更好,因为后者的工作量超出了需要,但仅使用数组中的第一个元素),并且JS中的exec函数返回结果数组,因此Python中类似的函数会返回诸如findall类的结果。

就像JS中OP的正则表达式/\\w+ \\w+ (".*?"|\\S+) (".*?"|\\S+)/ ,全局标记也没有设置为ON,这意味着他只对第一场比赛感兴趣只是,我使用了findall结果的第一个元素[0] ,其中我的Python代码解决方案是这样,

import re
s = 'add cmd item configname AAA 10.0.0.1 80 -option NONE -option2 YES -Option3 180'
arr = [s for s in re.findall(r'(\w+ \w+ (".*?"|\S+) (".*?"|\S+))', s)[0]]
print(arr)

哪个印刷,

['add cmd item configname', 'item', 'configname']

但是search功能也可以实现相同的功能,因为它逐个迭代地进行搜索,因此它比findall更好,因为findall通过在一次操作中扫描整个字符串来查找所有可能的结果,这与search不同,但是仅通过访问第一个元素才首先使用在数组中。 因此,使用与findall过于相似的search功能发布解决方案,该解决方案也可以由OP使用,并且效果更好,因为这只会查找第一个匹配项。 由于groups()返回一个元组,但OP需要一个数组,因此需要此代码,以便OP可以像JS中exec方法返回的那样完全按照他想要的方式获取数组中的结果。

import re
s = 'add cmd item configname AAA 10.0.0.1 80 -option NONE -option2 YES -Option3 180'
m = re.search(r'(\w+ \w+ (".*?"|\S+) (".*?"|\S+))', s)
if (m):
 arr = [s for s in m.groups()]
 print(arr)

打印,

['add cmd item configname', 'item', 'configname']

但是,是的,需要对JS正则表达式进行一次更改,以将整个正则表达式包含在一个额外的括号中,否则就不会给出OP所寻找的结果。

实际上,您可以在Python中创建一个函数exec ,以从JS模仿它,如下所示:

import re

def exec(regex, s):
 m = re.search(regex, s)
 if (m):
  return [s for s in m.groups()]


arr = exec(r'(\w+ \w+ (".*?"|\S+) (".*?"|\S+))', 'add cmd item configname AAA 10.0.0.1 80 -option NONE -option2 YES -Option3 180')
print(arr)

这也可以提供相同的输出,并且可以重复使用,因此是一种很好的处理方式,

['add cmd item configname', 'item', 'configname']

最后,我很高兴通过经过评论的健康辩论,OP可以解决该问题。

如果您随时遇到任何问题或有任何疑问,请随时告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM