![](/img/trans.png)
[英]JavaScript regex.exec() should intended to use an assembled regEx
[英]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.